ZGlmZiAtLWdpdCBhL0NPUFlJTkcgYi9DT1BZSU5HCmluZGV4IGM1NjExZTQuLjYyM2I2MjUgMTAwNjQ0Ci0tLSBhL0NPUFlJTkcKKysrIGIvQ09QWUlORwpAQCAtNTUsNyArNTUsNyBAQAogCiAgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCiBtb2RpZmljYXRpb24gZm9sbG93LgotCisMCiAJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQogICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCiAKQEAgLTExMCw3ICsxMTAsNyBAQAogICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0CiAgICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgogICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQotCisMCiBUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCiBpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAogYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCkBAIC0xNjgsNyArMTY4LDcgQEAKIGFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcwogZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90CiBjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotCisMCiAgIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQogZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAogb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCkBAIC0yMjUsNyArMjI1LDcgQEAKIAogVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCiBiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KLQorDAogICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgogY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCiBvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCkBAIC0yNzgsNyArMjc4LDcgQEAKIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KIAogCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCisMCiAJICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcwogCiAgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjg0OWVjCi0tLSAvZGV2L251bGwKKysrIGIvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsNDMgQEAKKzIwMDUtMDgtMTMgIGdldHRleHRpemUgIDxidWctZ251LWdldHRleHRAZ251Lm9yZz4KKworCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgY29uZmlnLnJwYXRoLCBta2luc3RhbGxkaXJzLgorCSogY29uZmlndXJlLmluIChBTV9HTlVfR0VUVEVYVF9WRVJTSU9OKTogQnVtcCB0byAwLjE0LjQuCisKKzAuMC43IC0+IDAuMi4wCisKKyogcmVtb3ZlZCBlcnJvciBtZXNzYWdlIGZyb20gYWxzYW1peGVyCisqIGZpeGVzIGluIGFsc2FjdGwgcHJvZ3JhbQorKiB2ZXJzaW9uIGlzIG5vdyBjb21wYXRpYmxlIHdpdGggZHJpdmVyCisKKzAuMC42IC0+IDAuMC43CisKKyogYWRkZWQgYWxzYWN0bCBjb250cm9sIHByb2dyYW0KKyogdXBkYXRlZCBhbHNhbWl4ZXIgYnkgQ2FybCB2YW4gU2NoYWlrIDxjYXJsQGRyZWFtY29hdC5jaGUudWN0LmFjLnphPgorICAtIHN0ZXJlbyByZWNvcmQgc291cmNlIHNlbGVjdAorICAtIGxlZnQvcmlnaHQgcm91dGUgc3VwcG9ydAorCiswLjAuNSAtPiAwLjAuNgorCisqIHVwZGF0ZXMgZm9yIG5ldyBhbHNhLWxpYgorKiBmaXhlZCBjb21waWxhdGlvbiBwcm9ibGVtcyB3aXRoIGNvbmZpZy5oIGhlYWRlciBmaWxlCisqIHVwZGF0ZWQgb3V0cHV0ICdhcGxheSAtbCcKKworMC4wLjMgLT4gMC4wLjQKKworKiBhZGRlZCBjaGVjayBmb3IgYWxzYS1saWIgcGFja2FnZQorKiBhZGRlZCBzcGVjIGZpbGUgZm9yIFJQTQorCiswLjAuMiAtPiAwLjAuMworCisqIGluY2x1ZGVkIGdyZWF0IG5jdXJzZXMgYWxzYW1peGVyIGZyb20gVGltIEphbmlrIDx0aW1qQGd0ay5vcmc+CisqIGVuaGFuY2VkIE1peGVyIGZyb20gQW5keSBMbyBBIEZvZSA8YXJsb2Fmb2VAY3MudnUubmw+IHJlbmFtZWQgdG8gYW1peGVyCisKKzAuMC4xIC0+IDAuMC4yCisKKyogZml4ZWQgc21hbGwgYnVnIGluIGFwbGF5IGluIGNvbW1hbmQgbGluZSBwYXJzaW5nCisqIGZpeGVkIGZyYWdtZW50IHNpemUgYWxsb2NhdGlvbiBmb3IgbG93IHJhdGUgZmlsZXMgaW4gYXBsYXkKKyogYSBsaXR0bGUgYml0IGNvcnJlY3RlZCBvdXRwdXQgZnJvbSBNaXhlcgorCiswLjAuMQorCisqIGluaXRpYWwgcmVsZWFzZSAoYXBsYXksIGJyb2tlbiBNaXhlcikKZGlmZiAtLWdpdCBhL0lOU1RBTEwgYi9JTlNUQUxMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMmM0OTEKLS0tIC9kZXYvbnVsbAorKysgYi9JTlNUQUxMCkBAIC0wLDAgKzEsNDYgQEAKKworCQkJQUxTQSB1dGlscyBpbnN0YWxsYXRpb24KKwkJCT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlcXVpcmVtZW50cworLS0tLS0tLS0tLS0tCisKK2Fsc2FtaXhlciByZXF1aXJlcyB0aGUgbmN1cnNlcyBsaWJyYXJ5LiAgU29tZSBzeXN0ZW1zIG5lZWQgdG8gaW5zdGFsbAordGhlIGRldmVsb3AgcGFja2FnZSBhZGRpdGlvbmFsbHkgdG8gbGluayB3aXRoIHRoaXMgbGlicmFyeS4KKworYWxzYWNvbmYgcmVxdWlyZXMgZGlhbG9nIG9yIHdoaXB0YWlsIHByb2dyYW0gdG8gcnVuIHByb3Blcmx5LgorCitJbnN0YWxsYXRpb24KKy0tLS0tLS0tLS0tLQorCitGb3IgaW5zdGFsbGF0aW9uIHlvdSBjYW4gdXNlIHRoZXNlIGNvbW1hbmRzOgorCisJLi9jb25maWd1cmUKKwltYWtlIGluc3RhbGwKKworSWYgLi9jb25maWd1cmUgY29tbWFuZCBjb21wbGFpbiB0aGF0IGFsc2EtbGliIHBhY2thZ2UgaXNuJ3QgaW5zdGFsbGVkLAorcGxlYXNlLCBjaGVjayBpZiAtLXByZWZpeCBvcHRpb24gaXMgc2FtZSBmb3IgYWxzYS1saWIgYW5kIGFsc2EtdXRpbHMKK3BhY2thZ2UuIFRoZSBjb25maWd1cmUgc2NyaXB0IGZyb20gYWxzYS11dGlscyBwYWNrYWdlIHByb2JhYmx5IGNhbm5vdCBmaW5kCitoZWFkZXIgZmlsZSBhc291bmRsaWIuaCBpbiAkcHJlZml4L2luY2x1ZGUvYWxzYSBkaXJlY3RvcnkgKHVzdWFsbHkgaW4KKy91c3IvaW5jbHVkZS9hbHNhIGRpcmVjdG9yeSkuCisKK0NvbXBpbGF0aW9uIGZyb20gSEcgc291cmNlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1lvdSBuZWVkIGFsc28gR05VIHBhY2thZ2VzIGF1dG9jb25mIGFuZCBhdXRvbWFrZSBpbnN0YWxsZWQgaW4geW91ciBzeXN0ZW0KK3RvIGNvbXBpbGUgSEcgKE1lcmN1cmlhbCkgc291cmNlcyBvZiBhbHNhLXV0aWxzIHBhY2thZ2UuCisKK0ZvciBjb21waWxhdGlvbiB5b3UgY2FuIHVzZSB0aGVzZSBjb21tYW5kczoKKworCWFjbG9jYWwKKwlnZXR0ZXh0aXplCisJYXV0b2hlYWRlcgorCWF1dG9tYWtlIC0tZm9yZWlnbiAtLWNvcHkgLS1hZGQtbWlzc2luZworCWF1dG9jb25mCisJLi9jb25maWd1cmUKKwltYWtlCisKK1RoZSBpbmNsdWRlZCBoZ2NvbXBpbGUgc2NyaXB0IGRvZXMgdGhpcyBqb2IgZm9yIHlvdS4KKworTm90ZTogU29tZSBhdXRvbWFrZSBwYWNrYWdlcyBoYXZlIG1pc3NpbmcgYWNsb2NhbCBwcm9ncmFtLiBVc2UgbmV3ZXIgdmVyc2lvbgorICAgICAgaW4gdGhlIGNhc2UuCmRpZmYgLS1naXQgYS9MSUNFTlNFIGIvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5kMjQ4NDJmCi0tLSAvZGV2L251bGwKKysrIGIvTElDRU5TRQpAQCAtMCwwICsxIEBACitDT1BZSU5HClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuYW0gYi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWQ2OWFiCi0tLSAvZGV2L251bGwKKysrIGIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0NSBAQAorSU5DTFVERVM9LUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUKKworU1VCRElSUyA9IGluY2x1ZGUgYWxzYWN0bCBhbHNhdWNtIHV0aWxzIG00IHBvCitpZiBBTFNBTUlYRVIKK1NVQkRJUlMgKz0gYWxzYW1peGVyCitlbmRpZgoraWYgSEFWRV9NSVhFUgorU1VCRElSUyArPSBhbWl4ZXIKK2VuZGlmCitpZiBIQVZFX1JBV01JREkKK1NVQkRJUlMgKz0gYW1pZGkKK2VuZGlmCitpZiBBTFNBQ09ORgorU1VCRElSUyArPSBhbHNhY29uZgorZW5kaWYKK2lmIEhBVkVfUENNCitTVUJESVJTICs9IGFwbGF5IGllY3NldCBzcGVha2VyLXRlc3QKK2lmIEFMU0FMT09QCitTVUJESVJTICs9IGFsc2Fsb29wCitlbmRpZgorZW5kaWYKK2lmIEhBVkVfU0VRCitTVUJESVJTICs9IHNlcQorZW5kaWYKKworRVhUUkFfRElTVD0gVE9ETyBnaXRjb21waWxlCitBVVRPTUFLRV9PUFRJT05TPWZvcmVpZ24KK0FDTE9DQUxfQU1GTEFHUyA9IC1JIG00CisKK3JwbTogZGlzdAorCSQoTUFLRSkgLUMgJEAKKworZGlzdC1ob29rOgorCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQorCUBpZiAhIHRlc3QgLXogIiQoQU1UQVIpIjsgdGhlbiBcCisJCSQoQU1UQVIpIC0tY3JlYXRlIC0tdmVyYm9zZSAtLWZpbGU9LSAkKGRpc3RkaXIpIHwgYnppcDIgLWMgLTkgPiAkKGRpc3RkaXIpLnRhci5iejIgOyBcCisJZWxzZSBcCisJCSQoVEFSKSAtLWNyZWF0ZSAtLXZlcmJvc2UgLS1maWxlPS0gJChkaXN0ZGlyKSB8IGJ6aXAyIC1jIC05ID4gJChkaXN0ZGlyKS50YXIuYnoyIDsgXAorCWZpCisKK2luc3RhbGwtZGF0YS1ob29rOgorCSQoTUtESVJfUCkgLW0gMDc1NSAkKERFU1RESVIpJChBU09VTkRfU1RBVEVfRElSKQorCitESVNUQ0hFQ0tfQ09ORklHVVJFX0ZMQUdTID0gXAorICAgICAgICAtLXdpdGgtc3lzdGVtZHN5c3RlbXVuaXRkaXI9JCRkY19pbnN0YWxsX2Jhc2UvJChzeXN0ZW1kc3lzdGVtdW5pdGRpcikKZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2UwNjgxCi0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FCkBAIC0wLDAgKzEsMjAgQEAKKworCQlBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUgLSBVdGlsaXRpZXMKKwkJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgcGFja2FnZSBjb250YWlucyB0aGUgY29tbWFuZCBsaW5lIHV0aWxpdGllcyBmb3IgdGhlIEFMU0EgcHJvamVjdC4KK1RoZSBwYWNrYWdlIGNhbiBiZSBjb21waWxlZCBvbmx5IHdpdGggdGhlIGluc3RhbGxlZCBBTFNBIGRyaXZlciBhbmQKK3RoZSBBTFNBIEMgbGlicmFyeS4KKworYWxzYWNvbmYJLSB0aGUgQUxTQSBkcml2ZXIgY29uZmlndXJhdG9yIHNjcmlwdAorYWxzYWN0bAkJLSBhbiB1dGlsaXR5IGZvciBzb3VuZGNhcmQgc2V0dGluZ3MgbWFuYWdlbWVudAorYXBsYXkvYXJlY29yZAktIGFuIHV0aWxpdHkgZm9yIHRoZSBwbGF5YmFjayAvIGNhcHR1cmUgb2YgLndhdiwudm9jLC5hdSBmaWxlcworYW1peGVyCQktIGEgY29tbWFuZCBsaW5lIG1peGVyCithbHNhbWl4ZXIJLSBhIG5jdXJzZXMgbWl4ZXIKK2FtaWRpCQktIGEgdXRpbGl0eSB0byBzZW5kL3JlY2VpdmUgc3lzZXggZHVtcHMgb3Igb3RoZXIgTUlESSBkYXRhCitpZWNzZXQJCS0gYSB1dGlsaXR5IHRvIHNob3cvc2V0IHRoZSBJRUM5NTggc3RhdHVzIGJpdHMKKworWW91IG1heSBnaXZlIGEgbG9vayBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgQUxTQSBwcm9qZWN0IHRvIFVSTAoraHR0cDovL3d3dy5hbHNhLXByb2plY3Qub3JnLgorCisJCQkJCUphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CmRpZmYgLS1naXQgYS9UT0RPIGIvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWQ4ODBmCi0tLSAvZGV2L251bGwKKysrIGIvVE9ETwpAQCAtMCwwICsxLDQgQEAKK0ggYWRkIG9wdGlvbnMgdG8gYXBsYXkgdG8gYXZvaWQgeHJ1biB1c2luZyBhcmVjb3JkIHwgYXBsYXkKK00gUmV3cml0ZSBhcGxheS9hcmVjb3JkIHRvb2wgYW5kIHNlcGFyYXRlIHRoZSBleHBlcmltZW50YWwgc3R1ZmYKK00gV3JpdGUgYSAqZ29vZCogbWl4ZXIKK0wgQWRkIHN1cHBvcnQgZm9yIE9TUyBzZXR1cHMgdG8gYWxzYWN0bApkaWZmIC0tZ2l0IGEvYWNpbmNsdWRlLm00IGIvYWNpbmNsdWRlLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NTUwZjEKLS0tIC9kZXYvbnVsbAorKysgYi9hY2luY2x1ZGUubTQKQEAgLTAsMCArMSwxMiBAQAorQUNfREVGVU4oW1NBVkVfVVRJTF9WRVJTSU9OXSwgWworU05EX1VUSUxfVkVSU0lPTj0kVkVSU0lPTgorZWNobyAkVkVSU0lPTiA+ICRzcmNkaXIvdmVyc2lvbgorQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkU05EX1VUSUxfVkVSU0lPTiIsIFtBTFNBIHV0aWwgdmVyc2lvbl0pCitBQ19TVUJTVChTTkRfVVRJTF9WRVJTSU9OKQorU05EX1VUSUxfTUFKT1I9YGVjaG8gJFZFUlNJT04gfCBjdXQgLWQgLiAtZiAxYAorQUNfU1VCU1QoU05EX1VUSUxfTUFKT1IpCitTTkRfVVRJTF9NSU5PUj1gZWNobyAkVkVSU0lPTiB8IGN1dCAtZCAuIC1mIDJgCitBQ19TVUJTVChTTkRfVVRJTF9NSU5PUikKK1NORF9VVElMX1NVQk1JTk9SPWBlY2hvICRWRVJTSU9OIHwgY3V0IC1kIC4gLWYgMyB8IHNlZCAtZSAncy9wcmVbWzAtOV1dKi8vZydgCitBQ19TVUJTVChTTkRfVVRJTF9TVUJNSU5PUikKK10pCmRpZmYgLS1naXQgYS9hbHNhY29uZi9NYWtlZmlsZS5hbSBiL2Fsc2Fjb25mL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZjVlNGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbHNhY29uZi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDM3IEBACitzYmluX1NDUklQVFMgPSBhbHNhY29uZgorbWFuX01BTlMgPSBhbHNhY29uZi44IGFsc2Fjb25mLmZyLjgKK0VYVFJBX0RJU1QgPSAkKG1hbl9NQU5TKQorU1VCRElSUyA9IHBvCisKK2luc3RhbGwtbWFuODoKKwlAZm9yIGkgaW4gJChtYW5fTUFOUyk7IGRvIFwKKwkgIGV4dD1gZWNobyAkJGkgfCAkKFNFRCkgLWUgJ3MvXi4qXFwuLy8nYDsgXAorCSAgaW5zdD1gZWNobyAkJGkgfCAkKFNFRCkgLWUgJ3MvXFwuW14uXSokJC8vJ2A7IFwKKwkgIGNhc2UgJCRpbnN0IGluIFwKKwkgICouW2EtemEtel0qKVwKKwkgICAgbG9jPWBlY2hvICQkaW5zdCB8ICQoU0VEKSAtZSAncy9eLipcXC4vLydgOyBcCisJICAgIGxvYz0iLyQkbG9jIjsgXAorCSAgICBpbnN0PWBlY2hvICQkaW5zdCB8ICQoU0VEKSAtZSAncy9cXC5bXi5dKiQkLy8nYDs7IFwKKwkgICopXAorCSAgICBsb2M9IiI7OyBcCisJICBlc2FjOyBcCisJICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKG1hbmRpcikkJGxvYy9tYW4kJGV4dDsgXAorCSAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGkgJChERVNURElSKSQobWFuZGlyKSQkbG9jL21hbiQkZXh0LyQkaW5zdC4kJGV4dCI7IFwKKwkgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRpICQoREVTVERJUikkKG1hbmRpcikkJGxvYy9tYW4kJGV4dC8kJGluc3QuJCRleHQ7IFwKKwlkb25lCisKK3VuaW5zdGFsbC1tYW44OgorCUBmb3IgaSBpbiAkKG1hbl9NQU5TKTsgZG8gXAorCSAgZXh0PWBlY2hvICQkaSB8ICQoU0VEKSAtZSAncy9eLipcXC4vLydgOyBcCisJICBpbnN0PWBlY2hvICQkaSB8ICQoU0VEKSAtZSAncy9cXC5bXi5dKiQkLy8nYDsgXAorCSAgY2FzZSAkJGluc3QgaW4gXAorCSAgKi5bYS16YS16XSopXAorCSAgICBsb2M9YGVjaG8gJCRpbnN0IHwgJChTRUQpIC1lICdzL14uKlxcLi8vJ2A7IFwKKwkgICAgbG9jPSIvJCRsb2MiOyBcCisJICAgIGluc3Q9YGVjaG8gJCRpbnN0IHwgJChTRUQpIC1lICdzL1xcLlteLl0qJCQvLydgOzsgXAorCSAgKilcCisJICAgIGxvYz0iIjs7IFwKKwkgIGVzYWM7IFwKKwkgIGVjaG8gIiBybSAtZiAkKERFU1RESVIpJChtYW5kaXIpJCRsb2MvbWFuJCRleHQvJCRpbnN0LiQkZXh0IjsgXAorCSAgcm0gLWYgJChERVNURElSKSQobWFuZGlyKSQkbG9jL21hbiQkZXh0LyQkaW5zdC4kJGV4dDsgXAorCWRvbmUKZGlmZiAtLWdpdCBhL2Fsc2Fjb25mL2Fsc2Fjb25mLjggYi9hbHNhY29uZi9hbHNhY29uZi44Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZTEyOTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbHNhY29uZi9hbHNhY29uZi44CkBAIC0wLDAgKzEsMTAyIEBACisuXCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhleSwgRU1BQ1M6IC0qLSBucm9mZiAtKi0KKy5cIiBhbHNhY29uZi44IGlzIGNvcHlyaWdodCAyMDAzIGJ5IEpvcmRpIE1hbGxhY2ggPGpvcmRpQGRlYmlhbi5vcmc+CisuXCIgCisuXCIgVGhpcyBpcyBmcmVlIGRvY3VtZW50YXRpb24sIHNlZSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIEdOVQorLlwiIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gVGhlcmUgaXMgTk8gd2FycmFudHkuCisuVEggQUxTQUNPTkYgOCAiRmVicnVhcnkgMjMsIDIwMDMiCisKKy5TSCBOQU1FCithbHNhY29uZiBcLSBjb25maWd1cmF0aW9uIHRvb2wgZm9yIHRoZSBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKKworLlNIIFNZTk9QU0lTCisuQiBhbHNhY29uZgorLlJJIFsgb3B0aW9ucyBdCisKKy5TSCBERVNDUklQVElPTgorVGhpcyBtYW51YWwgcGFnZSBkb2N1bWVudHMgYnJpZWZseSB0aGUKKy5CIGFsc2Fjb25mCitjb21tYW5kLgorVGhpcyBtYW51YWwgcGFnZSB3YXMgd3JpdHRlbiBmb3IgdGhlIERlYmlhbiBkaXN0cmlidXRpb24gYmVjYXVzZSB0aGUKK29yaWdpbmFsIHByb2dyYW0gZG9lcyBub3QgaGF2ZSBhIG1hbnVhbCBwYWdlLgorLlBQCitcZkJBbHNhY29uZlxmUCBpcyBhIHNpbXBsZSBzaGVsbCBzY3JpcHQgd2hpY2ggdHJpZXMgdG8gZGV0ZWN0IHRoZSBzb3VuZCBjYXJkcworb24geW91ciBzeXN0ZW0gYW5kIHdyaXRlcyBhIHN1aXRhYmxlIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgQUxTQS4gSXQgd2lsbCB0cnkKK3RvIGd1ZXNzIHdoYXQgR05VL0xpbnV4IGRpc3RyaWJ1dGlvbiB5b3UncmUgcnVubmluZywgYW5kIHdpbGwgYWN0IGFjY29yZGluZ2x5Cit0byB0aGUgc3RhbmRhcmRzIG9mIHRoYXQgZGlzdHJpYnV0aW9uLCBpZiBzcGVjaWZpYyBzdXBwb3J0IGlzIGF2YWlsYWJsZS4KKy5QUAorQWxzYWNvbmYgd2lsbCB3cml0ZSBhIG1vZHVsZS1pbml0LXRvb2xzIChvciBtb2R1dGlscykgc25pcHBldCB3aGljaCBjYW4gYmUgdGhlbiB1c2VkIGJ5IG1vZHVsZS1pbml0LXRvb2xzIChvciBtb2R1dGlscykKK3RvIGxvYWQgdGhlIGNvcnJlY3QgcGFyYW1ldGVycyBmb3IgeW91ciBzb3VuZCBjYXJkLgorCisuU0ggT1BUSU9OUworQWxzYWNvbmYgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisuVFAKKy5CIFwtYywgXC1cLWNvbmZpZyBmaWxlCitTcGVjaWZ5IHRoZSBtb2R1bGUgY29uZmlnIGZpbGUuCitBcyBkZWZhdWx0LAorLkIgYWxzYWNvbmYKK3Byb2JlcyB0aGUgYXZhaWxhYmxlIGNvbmZpZyBmaWxlIGF1dG9tYXRpY2FsbHkuCisuVFAKKy5CIFwtZCwgXC1cLWRldm1vZGUgbW9kZQorU2V0IHRoZSBkZXZpY2UgbW9kZSBmb3IgdGhlIEFMU0EgZGV2aWNlcyAoZGVmYXVsdCA9IDA2NjYpLgorVGhpcyBvcHRpb24gaXMgb2Jzb2xldGUgaW4gdGhlIHJlY2VudCBBTFNBIHZlcnNpb24uCisuVFAKKy5CIFwtZywgXC1cLWdpZCBnaWQKK1NldCB0aGUgZ2lkIGZvciB0aGUgQUxTQSBkZXZpY2VzIChkZWZhdWx0ID0gMCkuCitUaGlzIG9wdGlvbiBpcyBvYnNvbGV0ZSBpbiB0aGUgcmVjZW50IEFMU0EgdmVyc2lvbi4KKy5UUAorLkIgXC1oLCBcLVwtaGVscAorRGlzcGxheXMgdGhpcyBoZWxwIHRleHQuCisuVFAKKy5CIFwtTCwgXC1cLWxvZyBmaWxlCitMb2dnaW5nIG9uIHRoZSBnaXZlbiBmaWxlLiAgVGhlIGxvZyBpcyBhcHBlbmRlZCB0byB0aGUgZmlsZS4KK1RoaXMgb3B0aW9uIGlzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZSBvbmx5LgorLlRQCisuQiBcLWwsIFwtXC1sZWdhY3kKK0NoZWNrIG9ubHkgZm9yIGxlZ2FjeSBub24taXNhcG5wIGNhcmRzLgorLlRQCisuQiBcLW0sIFwtXC1tb2RpbmZvCitSZWFkIG1vZHVsZSBkZXNjcmlwdGlvbnMgaW5zdGVhZCBvZiByZWFkaW5nIGEgY2FyZCBkYXRhYmFzZS4KKy5UUAorLkIgXC1QLCBcLVwtbGlzdHByb2JlCitMaXN0IHRoZSBzdXBwb3J0ZWQgbGVnYWN5IGNhcmQgbW9kdWxlcy4KKy5UUAorLkIgXC1wLCBcLVwtcHJvYmUgY2FyZC1uYW1lCitQcm9iZSBhIGxlZ2FjeSBub24taXNhcG5wIGNhcmQgYW5kIHByaW50IG1vZHVsZSBvcHRpb25zLgorLlRQCisuQiBcLXIsIFwtXC1zdHJpY3QKK1NldCBzdHJpY3QgZGV2aWNlIG1vZGUgKGVxdWl2LiB3aXRoIFwtZyAxNyBcLWQgMDY2MCkuCitUaGlzIG9wdGlvbiBpcyBvYnNvbGV0ZSBpbiB0aGUgcmVjZW50IEFMU0EgdmVyc2lvbi4KKy5UUAorLkIgXC1zLCBcLVwtc291bmRcLXdhdlwtZmlsZQorVXNlIHRoZSBzcGVjaWZpZWQgd2F2IGZpbGUgYXMgYSB0ZXN0IHNvdW5kLgorLlRQCisuQiBcLXUsIFwtXC11aWQgdWlkCitTZXQgdGhlIHVpZCBmb3IgdGhlIEFMU0EgZGV2aWNlcyAoZGVmYXVsdCA9IDApLgorVGhpcyBvcHRpb24gaXMgb2Jzb2xldGUgaW4gdGhlIHJlY2VudCBBTFNBIHZlcnNpb24uCisKKy5TSCBERUJJQU4gU1BFQ0lGSUMKK0luIERlYmlhbiwgdGhlIGRlZmF1bHQgZ2lkIG9mIHRoZSBkZXZpY2UgZmlsZXMgaXMgMjkgKGNvcnJlc3BvbmRpbmcgdG8gdGhlCithdWRpbyBncm91cCkgYW5kIHRoZSBkZWZhdWx0IGRldmljZSBtb2RlIGlzIDA2NjAuCisKK0ZvciB0aGUgQUxTQSBiYXNlIHBhY2thZ2UsIHNlZSBhbHNvCisuSSAvdXNyL3NoYXJlL2RvYy9hbHNhXC1iYXNlLworCisuU0ggU0VFIEFMU08KK1xmQgorYWxzYW1peGVyKDEpLAorYW1peGVyKDEpLAorYXBsYXkoMSksCithcmVjb3JkKDEpCitcZlAKKworLlNIIEhPTUVQQUdFCitodHRwOi8vd3d3LmFsc2FcLXByb2plY3Qub3JnLworCisuU0ggQVVUSE9SCitUaGUgYWxzYWNvbmYgc2NyaXB0IHdhcyB3cml0dGVuIGJ5CitUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+LAorQmVybmQgS2FpbmRsIDxia0BzdXNlLmRlPiBhbmQKK0phbiBPbmRyZWogKFNBTCkgPG9uZHJlampAc2Fsc3Rhci5zaz4KKworVGhpcyBtYW51YWwgcGFnZSB3YXMgd3JpdHRlbiBieSBKb3JkaSBNYWxsYWNoIDxqb3JkaUBkZWJpYW4ub3JnPiwKK2ZvciB0aGUgRGViaWFuIHN5c3RlbSAoYnV0IG1heSBiZSB1c2VkIGJ5IG90aGVycykuCmRpZmYgLS1naXQgYS9hbHNhY29uZi9hbHNhY29uZi5mci44IGIvYWxzYWNvbmYvYWxzYWNvbmYuZnIuOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGJiZWE4Ci0tLSAvZGV2L251bGwKKysrIGIvYWxzYWNvbmYvYWxzYWNvbmYuZnIuOApAQCAtMCwwICsxLDExMSBAQAorLlwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZXksIEVNQUNTOiAtKi0gbnJvZmYgLSotCisuXCIgYWxzYWNvbmYuOCBpcyBjb3B5cmlnaHQgMjAwMyBieSBKb3JkaSBNYWxsYWNoIDxqb3JkaUBkZWJpYW4ub3JnPgorLlwiIAorLlwiIFRoaXMgaXMgZnJlZSBkb2N1bWVudGF0aW9uLCBzZWUgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBHTlUKKy5cIiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuIFRoZXJlIGlzIE5PIHdhcnJhbnR5LgorLlRIIEFMU0FDT05GIDggIjE1IG1hcnMgMjAwNSIKKworLlNIIE5PTQorYWxzYWNvbmYgXC0gb3V0aWwgZGUgY29uZmlndXJhdGlvbiBwb3VyIEFMU0EgKGFyY2hpdGVjdHVyZSBkZSBzb24gYXZhbmPpZSBkZSBMaW51eCkKKy5cIiBjb25maWd1cmF0aW9uIHRvb2wgZm9yIHRoZSBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKKworLlNIIFNZTk9QU0lTCisuQiBhbHNhY29uZgorLlJJIFsgb3B0aW9ucyBdCisKKy5TSCBERVNDUklQVElPTgorQ2V0dGUgcGFnZSBkZSBtYW51ZWwgZG9jdW1lbnRlIGJyaeh2ZW1lbnQgbGEgY29tbWFuZGUgCisuQiBhbHNhY29uZi4KKworLlBQCitcZkJBbHNhY29uZlxmUCAKK2VzdCB1biBzaW1wbGUgc2NyaXB0IHNoZWxsIHF1aSBlc3NheWUgZGUgZOl0ZWN0ZXIgbGVzIGNhcnRlcyBzb24gc3VyIHZvdHJlCitzeXN06G1lIGV0IOljcml0IHVuIGZpY2hpZXIgZGUgY29uZmlndXJhdGlvbiBhZOlxdWF0IHBvdXIgQUxTQS4gSWwgdmEKK2Vzc2F5ZXIgZGUgZGV2aW5lciBxdWVsbGUgZGlzdHJpYnV0aW9uIEdOVS9MaW51eCB2b3VzIHV0aWxpc2V6LCBldCBhZ2lyYQorY29uZm9ybeltZW50IGF1eCBzdGFuZGFyZHMgZGUgY2V0dGUgZGlzdHJpYnV0aW9uLCBzaSB1biBzdXBwb3J0IHNw6WNpZmlxdWUKK2VzdCBkaXNwb25pYmxlLgorCisuUFAKK0Fsc2Fjb25mIHZhIOljcmlyZSB1biBmcmFnbWVudCBkZSBjb2RlIG1vZHV0aWxzIHF1aSBwZXV0IOp0cmUgZW5zdWl0ZQordXRpbGlz6SBwYXIgbW9kdXRpbHMgcG91ciBjaGFyZ2VyIGxlcyBwYXJhbeh0cmVzIGNvcnJlY3RzIGRlIHZvdHJlIGNhcnRlCitzb24uIAorCisuU0ggT1BUSU9OUworQWxzYWNvbmYgYWNjZXB0ZSBsZXMgb3B0aW9ucyBzdWl2YW50ZXNcIDoKKworLlRQCisuQiBcLWwsIFwtXC1sZWdhY3kKK0NoZXJjaGUgc2V1bGVtZW50IGxlcyBhbmNpZW5uZXMgY2FydGVzIG5vbi1pc2FwbnAKKworLlRQCisuQiBcLW0sIFwtXC1tb2RpbmZvCitMaXQgbGVzIGRlc2NyaXB0aW9ucyBkZSBtb2R1bGVzIGF1IGxpZXUgZGUgbGlyZSB1bmUgYmFzZSBkZSBkb25u6WVzIGRlCitjYXJ0ZQorCisuVFAKKy5CIFwtcywgXC1cLXNvdW5kXC13YXZcLWZpbGUKK1V0aWxpc2UgbGUgZmljaGllciB3YXYgc3DpY2lmaekgY29tbWUgc29uIGRlIHRlc3QKKworLlRQCisuQiBcLXUsIFwtXC11aWQgdWlkCitDaG9pc2l0IGwndWlkIHBvdXIgbGVzIHDpcmlwaOlyaXF1ZXMgQUxTQSAodmFsZXVyIHBhciBk6WZhdXRcID0gMCkKKworLlRQCisuQiBcLWcsIFwtXC1naWQgZ2lkCitDaG9pc2l0IGxlIGdpZCBwb3VyIGxlcyBw6XJpcGjpcmlxdWVzIEFMU0EgKHZhbGV1ciBwYXIgZOlmYXV0XCA9IDApCisKKy5UUAorLkIgXC1kLCBcLVwtZGV2bW9kZSBtb2RlCitDaG9pc2l0IGxlIG1vZGUgZHUgcOlyaXBo6XJpcXVlIHBvdXIgbGVzIHDpcmlwaOlyaXF1ZXMgQUxTQSAodmFsZXVyIHBhcgorZOlmYXV0XCA6IDA2NjYpCisKKy5UUAorLkIgXC1yLCBcLVwtc3RyaWN0CitDaG9pc2l0IGxlIG1vZGUgZGUgcOlyaXBo6XJpcXVlIHN0cmljdCAo6XF1aXZhdXQg4CAtZ1wgMTcgLWRcIDA2NjApCisKKy5UUAorLkIgXC1MLCBcLVwtbG9nCitNaXNlIGVuIGpvdXJuYWwgZGFucyAvdG1wL2Fsc2Fjb25mLmxvZworCisuVFAKKy5CIFwtcCwgXC1cLXByb2JlIGNhcmQtbmFtZQorVGVzdGUgdW5lIGFuY2llbm5lIGNhcnRlIG5vbi1pc2FwbnAgZXQgYWZmaWNoZSBsZXMgb3B0aW9ucyBkdSBtb2R1bGUKKworLlRQCisuQiBcLWgsIFwtXC1oZWxwCitBZmZpY2hlIGNlIG1lc3NhZ2UgZCdhaWRlCisKKworLlNIIFBPVVIgREVCSUFOIEVYQ0xVU0lWRU1FTlQKK1NvdXMgRGViaWFuLCBsZSBnaWQgcGFyIGTpZmF1dCBkZXMgZmljaGllcnMgZGUgcOlyaXBo6XJpcXVlcyBlc3QgMjkgKHF1aQorY29ycmVzcG9uZCBhdSBncm91cGUgYXVkaW8pIGV0IGxlIG1vZGUgcGFyIGTpZmF1dCBkZXMgcOlyaXBo6XJpcXVlcyBlc3QKKzA2NjAuCisKK1BvdXIgbGUgcGFxdWV0YWdlIGRlIGJhc2UgQUxTQSwgdm9pciBhdXNzaQorLkkgL3Vzci9zaGFyZS9kb2MvYWxzYS1iYXNlLworCisuU0ggVk9JUiBBVVNTSQorXGZCCithbHNhbWl4ZXIoMSksCithbWl4ZXIoMSksCithcGxheSgxKSwKK2FyZWNvcmQoMSkKK1xmUAorCisuU0ggUEFHRSBEJ0FDQ1VFSUwKK2h0dHA6Ly93d3cuYWxzYS1wcm9qZWN0Lm9yZy8KKworLlNIIEFVVEVVUgorTGUgc2NyaXB0IGFsc2Fjb25mIGZ1dCDpY3JpdCBwYXIKK1Rha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4sCitCZXJuZCBLYWluZGwgPGJrQHN1c2UuZGU+IGV0CitKYW4gT25kcmVqIChTQUwpIDxvbmRyZWpqQHNhbHN0YXIuc2s+CisKK0NldHRlIHBhZ2UgZGUgbWFudWVsIGZ1dCDpY3JpdGUgcGFyIEpvcmRpIE1hbGxhY2ggPGpvcmRpQGRlYmlhbi5vcmc+LCBwb3VyCitsZSBzeXN06G1lIERlYmlhbiAobWFpcyBlbGxlIHBldXQg6nRyZSB1dGlsaXPpZSBwYXIgZCdhdXRyZXMpLgorCisuU0ggVFJBRFVDVElPTgorQmFwdGlzdGUgTels6HMgMjAwNS4KKworTido6XNpdGV6IHBhcyDgIHNpZ25hbGVyIOAgbCdhdXRldXIgb3UgYXUgdHJhZHVjdGV1ciwgc2Vsb24gbGUgY2FzLCB0b3V0ZQorZXJyZXVyIGRhbnMgY2V0dGUgcGFnZSBkZSBtYW51ZWwuCmRpZmYgLS1naXQgYS91c3Ivc2Jpbi9hbHNhY29uZiBiL2Fsc2Fjb25mL2Fsc2Fjb25mLmluCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gdXNyL3NiaW4vYWxzYWNvbmYKcmVuYW1lIHRvIGFsc2Fjb25mL2Fsc2Fjb25mLmluCmluZGV4IGFlZTY1N2MuLjVjMjM3ODcKLS0tIGEvdXNyL3NiaW4vYWxzYWNvbmYKKysrIGIvYWxzYWNvbmYvYWxzYWNvbmYuaW4KQEAgLTE5LDEyICsxOSwxMiBAQAogCiBleHBvcnQgVEVYVERPTUFJTj1hbHNhY29uZgogCi1wcmVmaXg9L3VzcgotZXhlY19wcmVmaXg9L3VzcgotYmluZGlyPSR7ZXhlY19wcmVmaXh9L2Jpbgotc2JpbmRpcj0ke2V4ZWNfcHJlZml4fS9zYmluCi12ZXJzaW9uPTEuMC4yNQotVVNFX05MUz15ZXMKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorYmluZGlyPUBiaW5kaXJACitzYmluZGlyPUBzYmluZGlyQAordmVyc2lvbj1AVkVSU0lPTkAKK1VTRV9OTFM9QFVTRV9OTFNACiAKICMgVXNlZnVsIGZvciBkZWJ1Z2dpbmcKIFBST0NGUz0iL3Byb2MiCkBAIC0xMTEsNyArMTExLDcgQEAKIGFsc2FfbW9kZT0wNjY2CiBsZWdhY3lfcHJvYmVfY2FyZD0iIgogTE9HRklMRT0iIgotVEVTVFNPVU5EPSIvdXNyL3NoYXJlL3Rlc3Qud2F2IgorVEVTVFNPVU5EPSJAVEVTVFNPVU5EQCIKIHRyeV9hbGxfY29tYmluYXRpb249MAogcmVzb3VyY2VzPSJmYWxzZSIKIApAQCAtOTU2LDkgKzk1Niw5IEBACiAJICBhcGxheSAtTiAkVEVTVFNPVU5ECiAgICAgICBmaQogICAgIGZpCi0gICAgbWtkaXIgLXAgLW0gMDc1NSAvdmFyL2xpYi9hbHNhCi0gICAgaWYgWyAhIC1yIC92YXIvbGliL2Fsc2EvYXNvdW5kLnN0YXRlIF07IHRoZW4KLQl4ZWNobyAiU2F2aW5nIHRoZSBtaXhlciBzZXR1cCB1c2VkIGZvciB0aGlzIGluIC92YXIvbGliL2Fsc2EvYXNvdW5kLnN0YXRlLiIKKyAgICBta2RpciAtcCAtbSAwNzU1IEBBU09VTkRfU1RBVEVfRElSQAorICAgIGlmIFsgISAtciBAQVNPVU5EX1NUQVRFX0RJUkAvYXNvdW5kLnN0YXRlIF07IHRoZW4KKwl4ZWNobyAiU2F2aW5nIHRoZSBtaXhlciBzZXR1cCB1c2VkIGZvciB0aGlzIGluIEBBU09VTkRfU1RBVEVfRElSQC9hc291bmQuc3RhdGUuIgogCSRzYmluZGlyL2Fsc2FjdGwgc3RvcmUKICAgICBmaQogICAgIGNsZWFyCmRpZmYgLS1naXQgYS9hbHNhY29uZi9wby9NYWtlZmlsZS5pbiBiL2Fsc2Fjb25mL3BvL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZmE5YWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbHNhY29uZi9wby9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDkxIEBACitQT0ZJTEVTID0gamEucG8gcnUucG8KKworRE9NQUlOID0gYWxzYWNvbmYKK0dFVFRFWFRfU1JDID0gLi4vYWxzYWNvbmYuaW4KKworWEdFVFRFWFRfT1BUSU9OUyA9IC1reG1zZyAta3hlY2hvCisKK3RvcF9idWlsZGRpciA9IC4uLy4uCisKK3NyY2RpciA9IEBzcmNkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK3ByZWZpeCA9IEBwcmVmaXhACitsb2NhbGVkaXIgPSAkKGRhdGFkaXIpL2xvY2FsZQorCitVU0VfTkxTID0gQFVTRV9OTFNACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorIyBta2Rpcl9wID0gQG1rZGlyX3BACitta2Rpcl9wID0gbWtkaXIgLXAgLS0KK1hHRVRURVhUID0gQFhHRVRURVhUQAorTVNHRk1UID0gQE1TR0ZNVEAKK0dNU0dGTVQgPSBAR01TR0ZNVEAKK01TR01FUkdFID0gQE1TR01FUkdFQAorTVNHTUVSR0VfVVBEQVRFID0gQE1TR01FUkdFQCAtLXVwZGF0ZQorCitESVNURklMRVMgPSAkKFBPRklMRVMpIE1ha2VmaWxlLmluCitDQVRBTE9HUyA9ICQoUE9GSUxFUzoucG89LmdtbykKKworYWxsOiBhbGwtQFVTRV9OTFNACisKK2FsbC15ZXM6ICQoQ0FUQUxPR1MpCithbGwtbm86CisKKy5TVUZGSVhFUzogLnBvIC5nbW8gLm1vCisKKyUubW8gOiAkKHNyY2RpcikvJS5wbworCSQoTVNHRk1UKSAtYyAtbyB0LSRAICQ8ICYmIG12IHQtJEAgJEAKKworJS5nbW8gOiAkKHNyY2RpcikvJS5wbworCUBsYW5nPWBlY2hvICQoc3JjZGlyKS8kKiB8IHNlZCAtZSAncywuKi8sLCdgOyBcCisJcm0gLWYgJCR7bGFuZ30uZ21vICYmICQoR01TR0ZNVCkgLWMgLS1zdGF0aXN0aWNzIC1vIHQtJCR7bGFuZ30uZ21vICQoc3JjZGlyKS8kJHtsYW5nfS5wbyAmJiBtdiB0LSQke2xhbmd9LmdtbyAkJHtsYW5nfS5nbW8KKworJChET01BSU4pLnBvdDogJChHRVRURVhUX1NSQykKKwkkKFhHRVRURVhUKSAtbyRAIC0tZGVmYXVsdC1kb21haW49JChET01BSU4pIFwKKwkgIC0tYWRkLWNvbW1lbnRzPVRSQU5TTEFUT1JTOiAtLWxhbmd1YWdlPVNoZWxsIFwKKwkgICQoWEdFVFRFWFRfT1BUSU9OUykgJDwKKworY2hlY2sgY2hlY2tfcmVjdXJzaXZlOgorCitjbGVhbjoKKwlybSAtZiAkKENBVEFMT0dTKSAkKFBPRklMRVM6LnBvPS5tbykgJChET01BSU4pLnBvdAorCit1cGRhdGUtcG86ICQoRE9NQUlOKS5wb3QKKwlAZm9yIHBvIGluICQoUE9GSUxFUyk7IGRvIFwKKwkkKE1TR01FUkdFX1VQREFURSkgJChzcmNkaXIpLyQkcG8gJChET01BSU4pLnBvdDsgXAorCWRvbmUKKworaW5zdGFsbC1kYXRhLW5vOgoraW5zdGFsbC1kYXRhLXllczogYWxsCisJJChta2Rpcl9wKSAkKERFU1RESVIpJChkYXRhZGlyKQorCUBjYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCisJZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCisJICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkIC1lICdzL1wuZ21vJCQvLydgOyBcCisJICBkaXI9JChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUzsgXAorCSAgJChta2Rpcl9wKSAkKERFU1RESVIpJCRkaXI7IFwKKwkgICQoSU5TVEFMTF9EQVRBKSAkJGNhdCAkKERFU1RESVIpJCRkaXIvJChET01BSU4pLm1vOyBcCisJZG9uZQorCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1AVVNFX05MU0AKK2luc3RhbGw6IGluc3RhbGwtZGF0YQorCit1bmluc3RhbGwtZGF0YS1ubzoKK3VuaW5zdGFsbC1kYXRhLXllczoKKwlAY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAorCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAorCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKKwkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgLWUgJ3MvXC5nbW8kJC8vJ2A7IFwKKwkgIHJtIC1mICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoRE9NQUlOKS5tbzsgXAorCWRvbmUKKwordW5pbnN0YWxsLWRhdGE6IHVuaW5zdGFsbC1kYXRhLUBVU0VfTkxTQAordW5pbnN0YWxsOiB1bmluc3RhbGwtZGF0YQorCitkaXN0IGRpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKKwkgIGNwIC1wICQkZmlsZSAkKGRpc3RkaXIpOyBcCisJZG9uZQorCitkaXN0Y2xlYW46IGNsZWFuCisJcm0gLWYgTWFrZWZpbGUgKn4KZGlmZiAtLWdpdCBhL2Fsc2Fjb25mL3BvL2phLnBvIGIvYWxzYWNvbmYvcG8vamEucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwZjcwOAotLS0gL2Rldi9udWxsCisrKyBiL2Fsc2Fjb25mL3BvL2phLnBvCkBAIC0wLDAgKzEsMzYyIEBACisjIFNPTUUgREVTQ1JJUFRJVkUgVElUTEUuCisjIENvcHlyaWdodCAoQykgWUVBUiBUSEUgUEFDS0FHRSdTIENPUFlSSUdIVCBIT0xERVIKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIFBBQ0tBR0UgcGFja2FnZS4KKyMgRklSU1QgQVVUSE9SIDxFTUFJTEBBRERSRVNTPiwgWUVBUi4KKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGFsc2Fjb25mXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IFxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDA1LTEyLTAyIDEyOjM3KzAxMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDA1LTEyLTAyIDEyOjM5KzAxMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBKYXBhbmVzZSA8TExAbGkub3JnPlxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorCisjOiAuLi9hbHNhY29uZi5pbjozNgorbXNnaWQgIi1zIgorbXNnc3RyICIiCisKKyM6IC4uL2Fsc2Fjb25mLmluOjgwCittc2dpZCAiQUxTQSBjb25maWd1cmF0b3IiCittc2dzdHIgIkFMU0Eg6Kit5a6a44OE44O844OrIgorCisjOiAuLi9hbHNhY29uZi5pbjo4MgorbXNnaWQgIiIKKyJ1c2FnZTogYWxzYWNvbmYgW29wdGlvbnNdXG4iCisiICAtbHwtLWxlZ2FjeSAgICBjaGVjayBvbmx5IGxlZ2FjeSBub24taXNhcG5wIGNhcmRzXG4iCisiICAtbXwtLW1vZGluZm8gICByZWFkIG1vZHVsZSBkZXNjcmlwdGlvbnMgaW5zdGVhZCBvZiByZWFkaW5nIGNhcmQgZGJcbiIKKyIgIC1zfC0tc291bmQgd2F2LWZpbGVcbiIKKyIgICAgICAgICAgICAgICAgIHVzZSB0aGUgc3BlY2lmaWVkIHdhdiBmaWxlIGFzIGEgdGVzdCBzb3VuZFxuIgorIiAgLXV8LS11aWQgdWlkICAgc2V0IHRoZSB1aWQgZm9yIHRoZSBBTFNBIGRldmljZXMgKGRlZmF1bHQgPSAwKSBbb2Jzb2xldGVkXVxuIgorIiAgLWd8LS1naWQgZ2lkICAgc2V0IHRoZSBnaWQgZm9yIHRoZSBBTFNBIGRldmljZXMgKGRlZmF1bHQgPSAwKSBbb2Jzb2xldGVkXVxuIgorIiAgLWR8LS1kZXZtb2RlIG1vZGVcbiIKKyIgICAgICAgICAgICAgICAgIHNldCB0aGUgcGVybWlzc2lvbiBmb3IgQUxTQSBkZXZpY2VzIChkZWZhdWx0ID0gMDY2NikgIgorIltvYnMuXVxuIgorIiAgLXJ8LS1zdHJpY3QgICAgc2V0IHN0cmljdCBkZXZpY2UgbW9kZSAoZXF1aXYuIHdpdGggLWcgMTcgLWQgMDY2MCkgIgorIltvYnNvbGV0ZWRdXG4iCisiICAtTHwtLWxvZyBmaWxlICBsb2dnaW5nIG9uIHRoZSBzcGVjaWZpZWQgZmlsZSAoZm9yIGRlYnVnZ2luZyBwdXJwb3NlIG9ubHkpXG4iCisiICAtcHwtLXByb2JlIGNhcmQtbmFtZVxuIgorIiAgICAgICAgICAgICAgICAgcHJvYmUgYSBsZWdhY3kgbm9uLWlzYXBucCBjYXJkIGFuZCBwcmludCBtb2R1bGUgb3B0aW9uc1xuIgorIiAgLVB8LS1saXN0cHJvYmUgbGlzdCB0aGUgc3VwcG9ydGVkIGxlZ2FjeSBjYXJkIG1vZHVsZXNcbiIKKyIgIC1jfC0tY29uZmlnIGZpbGVcbiIKKyIgICAgICAgICAgICAgICAgIHNwZWNpZnkgdGhlIG1vZHVsZSBjb25maWcgZmlsZVxuIgorIiAgLVJ8LS1yZXNvdXJjZXMgbGlzdCBhdmFpbGFibGUgRE1BIGFuZCBJUlEgcmVzb3VyY2VzIHdpdGggZGVidWcgZm9yIGxlZ2FjeVxuIgorIiAgLWh8LS1oZWxwICAgICAgd2hhdCB5b3UncmUgcmVhZGluZyIKK21zZ3N0ciAiIgorIuS9v+eUqOazlTogYWxzYWNvbmYgW+OCquODl+OCt+ODp+ODs11cbiIKKyIgIC1sfC0tbGVnYWN5ICAgIOmdniBJU0FQblAg44Kr44O844OJ44Gu44G/44OB44Kn44OD44Kv44GZ44KLXG4iCisiICAtbXwtLW1vZGluZm8gICDjgqvjg7zjg4kgREIg44KS6Kqt44KA5Luj44KP44KK44Gr44Oi44K444Ol44O844Or6KiY6L+w44KS6Kqt44G/6L6844G/XG4iCisiICAtc3wtLXNvdW5kIFdBVuODleOCoeOCpOODq1xuIgorIiAgICAgICAgICAgICAgICAg5oyH5a6a44GuIFdBViDjg5XjgqHjgqTjg6vjgpLjg4bjgrnjg4jpn7PjgajjgZfjgabnlKjjgYTjgotcbiIKKyIgIC11fC0tdWlkIHVpZCAgIEFMU0Eg44OH44OQ44Kk44K544GuIHVpZCAo44OH44OV44Kp44Or44OIID0gMCkgW+aXp+OCquODl+OCt+ODp+ODs+ODu+eEoeimluOBleOCjOOBvuOBmV1cbiIKKyIgIC1nfC0tZ2lkIGdpZCAgIEFMU0Eg44OH44OQ44Kk44K544GuIGdpZCAo44OH44OV44Kp44Or44OIID0gMCkgW+aXp11cXG5cIlxuIgorIiAgLWR8LS1kZXZtb2RlIOODouODvOODiVxuIgorIiAgICAgICAgICAgICAgICAgQUxTQSDjg4fjg5DjgqTjgrnjga7jg5Hjg7zjg5/jg4Pjgrfjg6fjg7Mo44OH44OV44Kp44Or44OIID0gMDY2NikgW+aXp11cbiIKKyIgIC1yfC0tc3RyaWN0ICAgIOWOs+agvOOBquODouODvOODiSAoLWcgMTcgLWQgMDY2MCDjgajlkIznrYkpIFvml6ddXG4iCisiICAtTHwtLWxvZyBmaWxlICDmjIflrprjga7jg5XjgqHjgqTjg6vjgavjg63jgrDjgpLoqJjpjLLjgZnjgosgKOODh+ODkOODg+OCsOeUqOmAlClcbiIKKyIgIC1wfC0tcHJvYmUg44Kr44O844OJ5ZCNXG4iCisiICAgICAgICAgICAgICAgICDmjIflrprjga4g6Z2eSXNhUG5QIOOCq+ODvOODieOCkuaknOe0ouOBl+ODouOCuOODpeODvOODq+OCquODl+OCt+ODp+ODs+OCkuihqOekuuOBmeOCi1xuIgorIiAgLVB8LS1saXN0cHJvYmUg44K144Od44O844OI44GV44KM44Gm44GE44KL5pen5byP44GuKOmdnmlzYXBucCnjgqvjg7zjg4njga7jg6Ljgrjjg6Xjg7zjg6vkuIDopqfooajnpLpcbiIKKyIgIC1jfC0tY29uZmlnIOODleOCoeOCpOODq1xuIgorIiAgICAgICAgICAgICAgICAg5oyH5a6a44Gu44Oi44K444Ol44O844Or6Kit5a6a44OV44Kh44Kk44Or44KS55So44GE44KLXG4iCisiICAtUnwtLXJlc291cmNlcyDjg6zjgqzjgrfjg7zjg4fjg5DjgqTjgrnjga7jg4fjg5Djg4PjgrDnlKg6IOWPr+iDveOBqiBETUEg44GoIElSUSDjgpLooajnpLrjgZnjgotcbiIKKyIgIC1ofC0taGVscCAgICAgIOS7iuimi+OBpuOBhOOBvuOBmSIKKworIzogLi4vYWxzYWNvbmYuaW46MjUyCittc2dpZCAiWW91IG11c3QgYmUgcm9vdCB0byB1c2UgdGhpcyBzY3JpcHQuIgorbXNnc3RyICLjg6vjg7zjg4jjga7jgb/lrp/ooYzlj6/og73jgafjgZkiCisKKyM6IC4uL2Fsc2Fjb25mLmluOjI5NAorbXNnaWQgIkVSUk9SOiBUaGUgY29uZmlnIGZpbGUgZG9lc24ndCBleGlzdDogIgorbXNnc3RyICLjgqjjg6njg7w6IOioreWumuODleOCoeOCpOODq+OBjOWtmOWcqOOBl+OBvuOBm+OCkzogIgorCisjOiAuLi9hbHNhY29uZi5pbjozMzYKK21zZ2lkICJFcnJvciwgZGlhbG9nIG9yIHdoaXB0YWlsIG5vdCBmb3VuZC4iCittc2dzdHIgIuOCqOODqeODvDogZGlhbG9nIOOBvuOBn+OBryB3aGlwdGFpbCDjgYzopovjgaTjgYvjgorjgb7jgZvjgpMiCisKKyM6IC4uL2Fsc2Fjb25mLmluOjM0MgorbXNnaWQgIkVycm9yLCBhd2sgbm90IGZvdW5kLiBDYW4ndCBjb250aW51ZS4iCittc2dzdHIgIuOCqOODqeODvDogYXdrIOOBjOimi+OBpOOBi+OCiuOBvuOBm+OCkyIKKworIzogLi4vYWxzYWNvbmYuaW46NDM5Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgICAgICAgICAgICBBTFNBICBDT05GSUdVUkFUT1JcbiIKKyIgICAgICAgICAgICAgICAgICAgdmVyc2lvbiAlc1xuIgorIlxuIgorIiAgICAgICAgICAgIFRoaXMgc2NyaXB0IGlzIGEgY29uZmlndXJhdG9yIGZvclxuIgorIiAgICBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUgKEFMU0EpIGRyaXZlci5cbiIKKyJcbiIKKyJcbiIKKyIgIElmIEFMU0EgaXMgYWxyZWFkeSBydW5uaW5nLCB5b3Ugc2hvdWxkIGNsb3NlIGFsbCBzb3VuZFxuIgorIiAgYXBwcyBub3cgYW5kIHN0b3AgdGhlIHNvdW5kIGRyaXZlci5cbiIKKyIgIGFsc2Fjb25mIHdpbGwgdHJ5IHRvIGRvIHRoaXMsIGJ1dCBpdCdzIG5vdCAxMDAlJSBzdXJlLiIKK21zZ3N0ciAiIgorIlxuIgorIiAgICAgICAgICAgICAgICAgICBBTFNBIOioreWumuODhOODvOODq1xuIgorIiAgICAgICAgICAgICAgICAgIOODkOODvOOCuOODp+ODsyAlc1xuIgorIlxuIgorIiAgICAg44GT44Gu44K544Kv44Oq44OX44OI44Gv44CBQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlXG4iCisiICAgIChBTFNBKSDjg4njg6njgqTjg5Djga7oqK3lrprjgpLooYzjgYbjg4Tjg7zjg6vjgafjgZnjgIJcbiIKKyJcbiIKKyJcbiIKKyIgICDjgoLjgZfml6LjgasgQUxTQSDjgYzotbfli5XjgZfjgabjgYTjgovloLTlkIjjga/jgIHlrp/ooYzliY3jgatcbiIKKyIgICDlhajjgabjga7jgrXjgqbjg7Pjg4njgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PjgpLplonjgZjjgabjgIHjgrXjgqbjg7Pjg4lcbiIKKyIgICDjg4njg6njgqTjg5DjgpLlgZzmraLjgZfjgabjgY/jgaDjgZXjgYTjgIJcbiIKKyIgICBhbHNhY29uZiDjga7li5XkvZzjga8gMTAwJSUg5L+d6Ki844Gn44GN44G+44Gb44KT44CCIgorCisjOiAuLi9hbHNhY29uZi5pbjo0NTUKK21zZ2lkICIiCisiXG4iCisiXG4iCisiICAgICBPSywgc291bmQgZHJpdmVyIGlzIGNvbmZpZ3VyZWQuXG4iCisiXG4iCisiICAgICAgICAgICAgICAgICAgQUxTQSAgQ09ORklHVVJBVE9SXG4iCisiXG4iCisiICAgICAgICAgIHdpbGwgcHJlcGFyZSB0aGUgY2FyZCBmb3IgcGxheWluZyBub3cuXG4iCisiXG4iCisiICAgICBOb3cgSSdsbCBydW4gYWxzYXNvdW5kIGluaXQgc2NyaXB0LCB0aGVuIEknbGwgdXNlXG4iCisiICAgICBhbWl4ZXIgdG8gcmFpc2UgdGhlIGRlZmF1bHQgdm9sdW1lcy5cbiIKKyIgICAgIFlvdSBjYW4gY2hhbmdlIHRoZSB2b2x1bWUgbGF0ZXIgdmlhIGEgbWl4ZXJcbiIKKyIgICAgIHByb2dyYW0gc3VjaCBhcyBhbHNhbWl4ZXIgb3IgZ2FtaXguXG4iCisiICBcbiIKKyIgICIKK21zZ3N0ciAiIgorIlxuIgorIlxuIgorIiAgICDjgrXjgqbjg7Pjg4njg4njg6njgqTjg5DjgYzoqK3lrprjgZXjgozjgb7jgZfjgZ/jgIJcbiIKKyJcbiIKKyIgICAg44GT44KM44GL44KJ44Kr44O844OJ44Gu5YaN55Sf44Gu5rqW5YKZ44KS6KGM44GE44G+44GZ44CCXG4iCisiXG4iCisiXG4iCisiICAgIGFsc2Fzb3VuZCDjgrnjgq/jg6rjg5fjg4jjgpLlrp/ooYzjgZfjgIHjgZ3jga7lvowgYW1peGVyIOOBp1xuIgorIiAgICDjg4fjg5Xjgqnjg6vjg4jjga7pn7Pph4/jgavoqK3lrprjgZfjgb7jgZnjgIJcbiIKKyIgICAg5b6M44Gn44CBYWxzYW1peGVyIOOChCBnYW1peCDjgarjganjga7jg5/jgq3jgrXjg7zjg5fjg63jgrDjg6njg6BcbiIKKyIgICAg44KS55So44GE44Gm44CB6Z+z6YeP44KS5aSJ5pu044GZ44KL44GT44Go44GM5Y+v6IO944Gn44GZ44CCXG4iCisiICAiCisKKyM6IC4uL2Fsc2Fjb25mLmluOjUxOCAuLi9hbHNhY29uZi5pbjo1MjMgLi4vYWxzYWNvbmYuaW46NTI4IC4uL2Fsc2Fjb25mLmluOjUzMworbXNnaWQgIkNhbid0IGNyZWF0ZSB0ZW1wIGZpbGUsIGV4aXRpbmcuLi4iCittc2dzdHIgIuS4gOaZguODleOCoeOCpOODq+OCkuS9nOaIkOOBp+OBjeOBvuOBm+OCk+OBp+OBl+OBn+OAguS4reatouOBl+OBvuOBmS4uLiIKKworIzogLi4vYWxzYWNvbmYuaW46NjQzCittc2dpZCAiQnVpbGRpbmcgY2FyZCBkYXRhYmFzZS4uIgorbXNnc3RyICLjgqvjg7zjg4njg4fjg7zjgr/jg5njg7zjgrnjgpLkvZzmiJDkuK0uLi4iCisKKyM6IC4uL2Fsc2Fjb25mLmluOjY0NworbXNnaWQgIk5vIGNhcmQgZGF0YWJhc2UgaXMgZm91bmQuLiIKK21zZ3N0ciAi44Kr44O844OJ44GM6KaL44Gk44GL44KK44G+44Gb44KT44Gn44GX44GfLi4uIgorCisjOiAuLi9hbHNhY29uZi5pbjo2NTIKK21zZ2lkICJTZWFyY2hpbmcgc291bmQgY2FyZHMiCittc2dzdHIgIuOCteOCpuODs+ODieOCq+ODvOODieOCkuaknOe0ouS4rSIKKworIzogLi4vYWxzYWNvbmYuaW46ODA2Cittc2dpZCAiIgorIlxuIgorIkNvbmZpZ3VyaW5nICVzXG4iCisiRG8geW91IHdhbnQgdG8gbW9kaWZ5ICVzIChhbmQgJXMgaWYgcHJlc2VudCk/IgorbXNnc3RyICIiCisiXG4iCisiJXMg44KS6Kit5a6a44GX44G+44GZXG4iCisiJXMgKOOBiuOCiOOBsyAlcykg44KS5aSJ5pu044GX44G+44GZ44GL77yfIgorCisjOiAuLi9hbHNhY29uZi5pbjo4MTEKK21zZ2lkICIiCisiXG4iCisiQ29uZmlndXJpbmcgJXNcbiIKKyJEbyB5b3Ugd2FudCB0byBtb2RpZnkgJXM/IgorbXNnc3RyICIiCisiXG4iCisiJXMg44KS6Kit5a6a44GX44G+44GZXG4iCisiJXMg44KS5aSJ5pu044GX44G+44GZ44GL77yfIgorCisjOiAuLi9hbHNhY29uZi5pbjo5MDAKK21zZ2lkICJSdW5uaW5nIG1vZHVsZXMtdXBkYXRlLi4uIgorbXNnc3RyICJtb2R1bGVzLXVwZGF0ZSDjgpLlrp/ooYzkuK0uLi4iCisKKyM6IC4uL2Fsc2Fjb25mLmluOjkwMworbXNnaWQgIlJ1bm5pbmcgdXBkYXRlLW1vZHVsZXMuLi4iCittc2dzdHIgInVwZGF0ZS1tb2R1bGVzIOOCkuWun+ihjOS4rS4uLiIKKworIzogLi4vYWxzYWNvbmYuaW46OTE1Cittc2dpZCAiIgorIlxuIgorIiAgICAgICBUaGUgbWl4ZXIgaXMgc2V0IHVwIG5vdyBmb3IgZm9yIHBsYXlpbmcuXG4iCisiICAgICAgIFNoYWxsIEkgdHJ5IHRvIHBsYXkgYSBzb3VuZCBzYW1wbGUgbm93P1xuIgorIlxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PVEU6XG4iCisiSWYgeW91IGhhdmUgYSBiaWcgYW1wbGlmaWVyLCBsb3dlciB5b3VyIHZvbHVtZXMgb3Igc2F5IG5vLlxuIgorIiAgICBPdGhlcndpc2UgY2hlY2sgdGhhdCB5b3VyIHNwZWFrZXIgdm9sdW1lIGlzIG9wZW4sXG4iCisiICAgICAgICAgIGFuZCBsb29rIGlmIHlvdSBjYW4gaGVhciB0ZXN0IHNvdW5kLlxuIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgIOmfs+mHj+OCkuWGjeeUn+eUqOOBq+a6luWCmeOBl+e1guOBiOOBvuOBl+OBn+OAglxuIgorIiAgICAgICDjgrXjg7Pjg5fjg6vjga7jgrXjgqbjg7Pjg4njgpLlho3nlJ/jgZfjgb7jgZnjgYvvvJ9cbiIKKyJcbiIKKyIgIOazqOaEjzpcbiIKKyIgIOWkp+WuuemHj+OCouODs+ODl+OBruWgtOWQiOOBr+OAgemfs+mHj+OCkuS4i+OBkuOBpuOBiuOBj+OBi+OAgeOBk+OBk+OBp+OAjOOBhOOBhOOBiOOAjVxuIgorIiAg44KS6YG45oqe44GX44Gm44GP44Gg44GV44GE44CC44K544OU44O844Kr44O844Gu6Z+z6YeP44KS44OB44Kn44OD44Kv44GX44Gm44CBXG4iCisiICDjg4bjgrnjg4jpn7PjgYzogZ7jgZPjgYjjgovjgYvjganjgYbjgYvnorroqo3jgZfjgabjgY/jgaDjgZXjgYTjgIJcbiIKKworIzogLi4vYWxzYWNvbmYuaW46OTMyCittc2dpZCAiU2F2aW5nIHRoZSBtaXhlciBzZXR1cCB1c2VkIGZvciB0aGlzIGluIC9ldGMvYXNvdW5kLnN0YXRlLiIKK21zZ3N0ciAi44Of44Kt44K144O844Gu6Kit5a6a44KSIC9ldGMvYXNvdW5kLnN0YXRlIOOBq+S/neWtmOOBl+OBvuOBmSIKKworIzogLi4vYWxzYWNvbmYuaW46OTM2Cittc2dpZCAiIgorIlxuIgorIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKKyJcbiIKKyIgTm93IEFMU0EgaXMgcmVhZHkgdG8gdXNlLlxuIgorIiBGb3IgYWRqdXN0bWVudCBvZiB2b2x1bWVzLCB1c2UgeW91ciBmYXZvcml0ZSBtaXhlci5cbiIKKyJcbiIKKyIgSGF2ZSBhIGxvdCBvZiBmdW4hXG4iCisiXG4iCittc2dzdHIgIiIKKyJcbiIKKyI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCisiXG4iCisiIOOBk+OCjOOBpyBBTFNBIOOBjOS9v+eUqOWPr+iDveOBq+OBquOCiuOBvuOBl+OBn+OAglxuIgorIiDpn7Pph4/jga7oqr/mlbTjgavjga/jgIHjg5/jgq3jgrXjg7zjg5fjg63jgrDjg6njg6DjgpLjgZTkvb/nlKjkuIvjgZXjgYTjgIJcbiIKKyJcbiIKKworIzogLi4vYWxzYWNvbmYuaW46MTI0NAorbXNnaWQgIldBUk5JTkciCittc2dzdHIgIuazqOaEjyIKKworIzogLi4vYWxzYWNvbmYuaW46MTI0NQorbXNnaWQgIiIKKyJcbiIKKyIgICBQcm9iaW5nIGxlZ2FjeSBJU0EgY2FyZHMgbWlnaHQgbWFrZVxuIgorIiAgIHlvdXIgc3lzdGVtIHVuc3RhYmxlLlxuIgorIlxuIgorIiAgICAgICAgRG8geW91IHdhbnQgdG8gcHJvY2VlZD9cbiIKKyJcbiIKK21zZ3N0ciAiIgorIlxuIgorIiAg5pen5byP44GuIElTQSDjgqvjg7zjg4njga7mpJzntKLjgpLooYzjgYbjgahcbiIKKyIgIOOCt+OCueODhuODoOOBjOS4jeWuieWumuOBq+OBquOCi+WgtOWQiOOBjOOBguOCiuOBvuOBmeOAglxuIgorIlxuIgorIiAg44GT44Gu44G+44G+57aa44GR44G+44GZ44GL77yfXG4iCisiXG4iCisKKyM6IC4uL2Fsc2Fjb25mLmluOjEyNjgKK21zZ2lkICIiCisiTm8gbGVnYWN5IGRyaXZlcnMgYXJlIGF2YWlsYWJsZVxuIgorIiAgIGZvciB5b3VyIG1hY2hpbmUiCittc2dzdHIgIiIKKyLml6flvI/jga4gSVNBIOOCq+ODvOODieOBr1xuIgorIuaknOWHuuOBleOCjOOBvuOBm+OCk+OBp+OBl+OBnyIKKworIzogLi4vYWxzYWNvbmYuaW46MTI3MworbXNnaWQgIkRyaXZlciBTZWxlY3Rpb24iCittc2dzdHIgIuODieODqeOCpOODkOOBrumBuOaKniIKKworIzogLi4vYWxzYWNvbmYuaW46MTI3NAorbXNnaWQgIiIKKyIgICAgICAgICAgIFByb2JpbmcgbGVnYWN5IElTQSBjYXJkc1xuIgorIlxuIgorIiAgICAgICAgUGxlYXNlIHNlbGVjdCB0aGUgZHJpdmVycyB0byBwcm9iZToiCittc2dzdHIgIiIKKyIgICAg5pen5byP44GuIElTQSDjgqvjg7zjg4njga7mpJzlh7pcbiIKKyJcbiIKKyIgICAg5qSc5Ye644GZ44KL44OJ44Op44Kk44OQ44KS6YG45oqe44GX44Gm44GP44Gg44GV44GEOiIKKworIzogLi4vYWxzYWNvbmYuaW46MTI4MQorbXNnaWQgIiIKKyJcbiIKKyIgU2hhbGwgSSB0cnkgYWxsIHBvc3NpYmxlIERNQSBhbmQgSVJRIGNvbWJpbmF0aW9ucz9cbiIKKyIgV2l0aCB0aGlzIG9wdGlvbiwgc29tZSB1bmNvbnZlbnRpb25hbCBjb25maWd1cmF0aW9uXG4iCisiIG1pZ2h0IGJlIGZvdW5kLCBidXQgaXQgd2lsbCB0YWtlIG11Y2ggbG9uZ2VyIHRpbWUuIgorbXNnc3RyICIiCisiXG4iCisiIOWPr+iDveOBqiBETUEg44GoIElSUSDjga7lhajjgabjga7ntYTlkIjjgZvjgpLoqabjgb/jgb7jgZnjgYvvvJ9cbiIKKyIg44GT44Gu44Kq44OX44K344On44Oz44Gn44Gv44CB44G+44KM44Gq6Kit5a6a44KC5qSc5Ye644GV44KM44KL44GT44Go44GMXG4iCisiIOWPr+iDveOBp+OBmeOBjOOAgeOCiOOCiumVt+OBhOaZgumWk+OBjOOBi+OBi+OCiuOBvuOBmeOAgiIKKworIzogLi4vYWxzYWNvbmYuaW46MTI5MQorbXNnaWQgIlByb2JpbmcgbGVnYWN5IGNhcmRzLi4gICBUaGlzIG1heSB0YWtlIGEgZmV3IG1pbnV0ZXMuLiIKK21zZ3N0ciAi5pen5byP44Kr44O844OJ44Gu5qSc5Ye65LitLi4uICDplbfmmYLplpPjgYzjgYvjgYvjgovjgZPjgajjgYzjgYLjgorjgb7jgZkuLi4iCisKKyM6IC4uL2Fsc2Fjb25mLmluOjEyOTIKK21zZ2lkICJQcm9iaW5nOiAiCittc2dzdHIgIuaknOWHuuS4rTogIgorCisjOiAuLi9hbHNhY29uZi5pbjoxMjk4Cittc2dpZCAiIDogRk9VTkQhISIKK21zZ3N0ciAiIDog55m66KaLISEiCisKKyM6IC4uL2Fsc2Fjb25mLmluOjEzMDQKK21zZ2lkICJSZXN1bHQiCittc2dzdHIgIue1kOaenCIKKworIzogLi4vYWxzYWNvbmYuaW46MTMwNQorbXNnaWQgIk5vIGxlZ2FjeSBjYXJkcyBmb3VuZCIKK21zZ3N0ciAi5pen5byP44Kr44O844OJ44GM6KaL44Gk44GL44KK44G+44Gb44KT44Gn44GX44GfIgorCisjOiAuLi9hbHNhY29uZi5pbjoxMzY0Cittc2dpZCAiIgorIlxuIgorIiBMb29rcyBsaWtlIHlvdSBoYXZpbmcgYSBUaGlua3BhZCA2MDBFIG9yIDc3MCBub3RlYm9vay5cbiIKKyIgT24gdGhpcyBub3RlYm9vaywgQ1M0MjM2IGRyaXZlciBzaG91bGQgYmUgdXNlZFxuIgorIiBhbHRob3VnaCBDUzQ2eHggY2hpcCBpcyBkZXRlY3RlZC5cbiIKKyJcbiIKKyIgU2hhbGwgSSB0cnkgdG8gc25kLWNzNDIzNiBkcml2ZXIgYW5kIHByb2JlXG4iCisiIHRoZSBsZWdhY3kgSVNBIGNvbmZpZ3VyYXRpb24/IgorbXNnc3RyICIiCisiXG4iCisiIFRoaW5rcGFkIDYwMEUg44G+44Gf44GvIDc3MCDjgpLjgZTkvb/nlKjjga7jgojjgYbjgafjgZnjgIJcbiIKKyIg44GT44Gu44Oe44K344Oz44Gn44Gv44CBQ1M0Nnh4IOODgeODg+ODl+OBjOaknOWHuuOBleOCjOOBvuOBmeOBjFxuIgorIiBDUzQyMzYg44OJ44Op44Kk44OQ44KS55So44GE44KL5b+F6KaB44GM44GC44KK44G+44GZ44CCXG4iCisiXG4iCisiIHNuZC1jczQyMzYg44OJ44Op44Kk44OQ44KS6Kmm55So44GX44Gm44CB5pen5byP44GuIElTQSDoqK3lrppcbiIKKyIg44Gu5qSc5Ye644KS6KGM44GE44G+44GZ44GL77yfIgorCisjOiAuLi9hbHNhY29uZi5pbjoxMzc4Cittc2dpZCAiIgorIlxuIgorIiBMb29rcyBsaWtlIHlvdSBoYXZpbmcgYSBEZWxsIERpbWVuc2lvbiBtYWNoaW5lLlxuIgorIiBPbiB0aGlzIG1hY2hpbmUsIENTNDIzMiBkcml2ZXIgc2hvdWxkIGJlIHVzZWRcbiIKKyIgYWx0aG91Z2ggQ1M0Nnh4IGNoaXAgaXMgZGV0ZWN0ZWQuXG4iCisiXG4iCisiIFNoYWxsIEkgdHJ5IHRvIHNuZC1jczQyMzIgZHJpdmVyIGFuZCBwcm9iZVxuIgorIiB0aGUgbGVnYWN5IElTQSBjb25maWd1cmF0aW9uPyIKK21zZ3N0ciAiIgorIlxuIgorIiBEZWxsIERpbWVuc2lvbiDjg57jgrfjg7PjgpLjgZTkvb/nlKjjga7jgojjgYbjgafjgZnjgIJcbiIKKyIg44GT44Gu44Oe44K344Oz44Gn44Gv44CBQ1M0Nnh4IOODgeODg+ODl+OBjOaknOWHuuOBleOCjOOBvuOBmeOBjFxuIgorIiBDUzQyMzIg44OJ44Op44Kk44OQ44KS55So44GE44KL5b+F6KaB44GM44GC44KK44G+44GZ44CCXG4iCisiXG4iCisiIHNuZC1jczQyMzIg44OJ44Op44Kk44OQ44KS6Kmm55So44GX44Gm44CB5pen5byP44GuIElTQSDoqK3lrppcbiIKKyIg44Gu5qSc5Ye644KS6KGM44GE44G+44GZ44GL77yfIgorCisjOiAuLi9hbHNhY29uZi5pbjoxMzk1Cittc2dpZCAiU291bmRjYXJkIFNlbGVjdGlvbiIKK21zZ3N0ciAi44K144Km44Oz44OJ44Kr44O844OJ44Gu6YG45oqeIgorCisjOiAuLi9hbHNhY29uZi5pbjoxMzk2Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIEZvbGxvd2luZyBjYXJkKHMpIGFyZSBmb3VuZCBvbiB5b3VyIHN5c3RlbS5cbiIKKyIgICAgICAgICBDaG9vc2UgYSBzb3VuZGNhcmQgdG8gY29uZmlndXJlOlxuIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICDku6XkuIvjga7jgqvjg7zjg4njgYzjgrfjgrnjg4bjg6DjgYvjgonmpJzlh7rjgZXjgozjgb7jgZfjgZ/jgIJcbiIKKyIgICAgICAgIOioreWumuOBmeOCi+OCq+ODvOODieOCkumBuOaKnuOBl+OBpuOBj+OBoOOBleOBhDpcbiIKKworIzogLi4vYWxzYWNvbmYuaW46MTQwOQorbXNnaWQgIiIKKyJcbiIKKyIgICAgICAgIE5vIHN1cHBvcnRlZCBQblAgb3IgUENJIGNhcmQgZm91bmQuXG4iCisiXG4iCisiIFdvdWxkIHlvdSBsaWtlIHRvIHByb2JlIGxlZ2FjeSBJU0Egc291bmQgY2FyZHMvY2hpcHM/XG4iCisiXG4iCittc2dzdHIgIiIKKyJcbiIKKyIgICBQblAg44G+44Gf44GvIFBDSSDjgqvjg7zjg4njgYzmpJzlh7rjgZXjgozjgb7jgZvjgpPjgafjgZfjgZ/jgIJcbiIKKyJcbiIKKyIg5pen5byP44GuIElTQSDjgrXjgqbjg7Pjg4njgqvjg7zjg4njga7mpJzlh7rjgpLooYzjgYTjgb7jgZnjgYvvvJ9cbiIKZGlmZiAtLWdpdCBhL2Fsc2Fjb25mL3BvL3J1LnBvIGIvYWxzYWNvbmYvcG8vcnUucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY0ZmEwZAotLS0gL2Rldi9udWxsCisrKyBiL2Fsc2Fjb25mL3BvL3J1LnBvCkBAIC0wLDAgKzEsMzczIEBACisjIFJ1c3NpYW4gdHJhbnNsYXRpb25zIGZvciBhbHNhLXV0aWxzIHBhY2thZ2UKKyMg0JDQvdCz0LvQuNC50YHQutC40LUg0L/QtdGA0LXQstC+0LTRiyDQtNC70Y8g0L/QsNC60LXRgtCwIGFsc2EtdXRpbHMuCisjIENvcHlyaWdodCAoQykgMjAwNSBUSEUgYWxzYS11dGlscydTIENPUFlSSUdIVCBIT0xERVIKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIGFsc2EtdXRpbHMgcGFja2FnZS4KKyMgIDxkdXNoaXN0b3ZAbWFpbC5ydT4sIDIwMDUuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBhbHNhLXV0aWxzIDEuMC45cmM0YVxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBcbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAwNS0xMi0wMiAxMjozNyswMTAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAwNS0xMi0wMiAxMjozOSswMTAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiAgPGR1c2hpc3RvdkBtYWlsLnJ1PlxuIgorIkxhbmd1YWdlLVRlYW06IFJ1c3NpYW4gPHJ1QGxpLm9yZz5cbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTM7IHBsdXJhbD0obiUxMD09MSAmJiBuJTEwMCE9MTEgPyAwIDogbiUxMD49MiAmJiBuJSIKKyIxMDw9NCAmJiAobiUxMDA8MTAgfHwgbiUxMDA+PTIwKSA/IDEgOiAyKTtcbiIKKworIzogLi4vYWxzYWNvbmYuaW46MzYKK21zZ2lkICItcyIKK21zZ3N0ciAiIgorCisjOiAuLi9hbHNhY29uZi5pbjo4MAorbXNnaWQgIkFMU0EgY29uZmlndXJhdG9yIgorbXNnc3RyICLQndCw0LnRgdGC0YDQvtC50YnQuNC6IEFMU0EiCisKKyM6IC4uL2Fsc2Fjb25mLmluOjgyCisjLCBmdXp6eQorbXNnaWQgIiIKKyJ1c2FnZTogYWxzYWNvbmYgW29wdGlvbnNdXG4iCisiICAtbHwtLWxlZ2FjeSAgICBjaGVjayBvbmx5IGxlZ2FjeSBub24taXNhcG5wIGNhcmRzXG4iCisiICAtbXwtLW1vZGluZm8gICByZWFkIG1vZHVsZSBkZXNjcmlwdGlvbnMgaW5zdGVhZCBvZiByZWFkaW5nIGNhcmQgZGJcbiIKKyIgIC1zfC0tc291bmQgd2F2LWZpbGVcbiIKKyIgICAgICAgICAgICAgICAgIHVzZSB0aGUgc3BlY2lmaWVkIHdhdiBmaWxlIGFzIGEgdGVzdCBzb3VuZFxuIgorIiAgLXV8LS11aWQgdWlkICAgc2V0IHRoZSB1aWQgZm9yIHRoZSBBTFNBIGRldmljZXMgKGRlZmF1bHQgPSAwKSBbb2Jzb2xldGVkXVxuIgorIiAgLWd8LS1naWQgZ2lkICAgc2V0IHRoZSBnaWQgZm9yIHRoZSBBTFNBIGRldmljZXMgKGRlZmF1bHQgPSAwKSBbb2Jzb2xldGVkXVxuIgorIiAgLWR8LS1kZXZtb2RlIG1vZGVcbiIKKyIgICAgICAgICAgICAgICAgIHNldCB0aGUgcGVybWlzc2lvbiBmb3IgQUxTQSBkZXZpY2VzIChkZWZhdWx0ID0gMDY2NikgIgorIltvYnMuXVxuIgorIiAgLXJ8LS1zdHJpY3QgICAgc2V0IHN0cmljdCBkZXZpY2UgbW9kZSAoZXF1aXYuIHdpdGggLWcgMTcgLWQgMDY2MCkgIgorIltvYnNvbGV0ZWRdXG4iCisiICAtTHwtLWxvZyBmaWxlICBsb2dnaW5nIG9uIHRoZSBzcGVjaWZpZWQgZmlsZSAoZm9yIGRlYnVnZ2luZyBwdXJwb3NlIG9ubHkpXG4iCisiICAtcHwtLXByb2JlIGNhcmQtbmFtZVxuIgorIiAgICAgICAgICAgICAgICAgcHJvYmUgYSBsZWdhY3kgbm9uLWlzYXBucCBjYXJkIGFuZCBwcmludCBtb2R1bGUgb3B0aW9uc1xuIgorIiAgLVB8LS1saXN0cHJvYmUgbGlzdCB0aGUgc3VwcG9ydGVkIGxlZ2FjeSBjYXJkIG1vZHVsZXNcbiIKKyIgIC1jfC0tY29uZmlnIGZpbGVcbiIKKyIgICAgICAgICAgICAgICAgIHNwZWNpZnkgdGhlIG1vZHVsZSBjb25maWcgZmlsZVxuIgorIiAgLVJ8LS1yZXNvdXJjZXMgbGlzdCBhdmFpbGFibGUgRE1BIGFuZCBJUlEgcmVzb3VyY2VzIHdpdGggZGVidWcgZm9yIGxlZ2FjeVxuIgorIiAgLWh8LS1oZWxwICAgICAgd2hhdCB5b3UncmUgcmVhZGluZyIKK21zZ3N0ciAiIgorItC40YHQv9C+0LvRjNC30L7QstCw0L3QuNC1OiBhbHNhY29uZiBb0L7Qv9GG0LjQuF1cbiIKKyIgIC1sfC0tbGVnYWN5ICAgINC/0YDQvtCy0LXRgNGP0YLRjCDRgtC+0LvRjNC60L4g0L3QtSBJU0FQblAg0LrQsNGA0YLRi1xuIgorIiAgLW18LS1tb2RpbmZvICAg0YfQuNGC0LDRgtGMINC+0L/QuNGB0LDQvdC40LUg0LzQvtC00YPQu9C10Lkg0LLQvNC10YHRgtC+INGH0YLQtdC90LjRjyDQsdGL0LfRiyDQtNCw0L3QvdGL0YUg0LrQsNGA0YJcbiIKKyIgIC1zfC0tc291bmQgV0FWINGE0LDQudC7XG4iCisiICAgICAgICAgICAgICAgICDQuNGB0L/QvtC70YzQt9C+0LLQsNGC0Ywg0YPQutCw0LfQsNC90L3Ri9C5IFdBViDRhNCw0LnQuyDQsiDQutCw0YfQtdGB0YLQstC1INGC0LXRgdGC0L7QstC+0LPQvlxuIgorIiAgLXV8LS11aWQgdWlkICAg0YPRgdGC0LDQvdCw0LLQu9C40LLQsNC10YIgdWlkINC00LvRjyBBTFNBKNC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOID0gMCkgW9GD0YHRgtCw0YDQtdC70L5dXG4iCisiICAtZ3wtLWdpZCBnaWQgICDRg9GB0YLQsNC90LDQstC70LjQstCw0LXRgiBnaWQg0LTQu9GPIEFMU0Eo0L/QviDRg9C80L7Qu9GH0LDQvdC40Y4gPSAwKSBb0YPRgdGC0LDRgNC10LvQvl1cbiIKKyIgIC1kfC0tZGV2bW9kZSDRgNC10LbQuNC8XG4iCisiICAgICAgICAgICAgICAgICDRg9GB0YLQsNC90LDQstC70LjQstCw0LXRgiDQv9GA0LDQstCwINC00L7RgdGC0YPQv9CwINC00LvRjyBBTFNBICjQv9C+INGD0LzQvtC70YfQsNC90LjRjiA9IDA2NjYpICIKKyJb0YPRgdGCLl1cbiIKKyIgIC1yfC0tc3RyaWN0ICAgINGD0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGCINGB0YLRgNC+0LPQuNC1INC/0YDQsNCy0LAg0LTQu9GPIEFMU0EgKNGN0LrQsi4gLWcgMTcgLWQgMDY2MCkgIgorIlvRg9GB0YIuXVxuIgorIiAgLUx8LS1sb2cg0YTQsNC50LsgINC30LDQv9C40YHRi9Cy0LDRgtGMINGB0L7QsdGL0YLQuNGPINCyINC+0L/RgNC10LTQtdC70LXQvdC90YvQuSDRhNCw0LnQuyAo0LIg0YbQtdC70Y/RhSDQvtGC0LvQsNC00LrQuClcbiIKKyIgIC1wfC0tcHJvYmUg0LjQvNGPINC30LLRg9C60L7QstC+0Lkg0LrQsNGA0YLRi1xuIgorIiAgICAgICAgICAgICAgICAg0L/RgNC+0LLQtdGA0LjRgtGMINC+0LHRi9GH0L3Rg9GOINC90LUgSXNhUG5QINC60LDRgNGC0YMg0Lgg0LLRi9Cy0LXRgdGC0Lgg0L7Qv9GG0LjQuCDQvNC+0LTRg9C70Y9cbiIKKyIgIC1QfC0tbGlzdHByb2JlINCy0YvQstC10YHRgtC4INGB0L/QuNGB0L7QuiDQv9C+0LTQtNC10YDQttC40LLQsNC10LzRi9GFINC90LUgSXNhUG5QINC60LDRgNGCXG4iCisiICAtY3wtLWNvbmZpZyDRhNCw0LnQu1xuIgorIiAgICAgICAgICAgICAgICAg0YPQutCw0LfRi9Cy0LDQtdGCINGE0LDQudC7INGBINC90LDRgdGC0YDQvtC50LrQsNC80Lgg0LzQvtC00YPQu9GPXG4iCisiICAtaHwtLWhlbHAgICAgICDQstGL0LLQtdGB0YLQuCDRjdGC0L4g0YHQvtC+0LHRidC10L3QuNC1IgorCisjOiAuLi9hbHNhY29uZi5pbjoyNTIKK21zZ2lkICJZb3UgbXVzdCBiZSByb290IHRvIHVzZSB0aGlzIHNjcmlwdC4iCittc2dzdHIgItCS0Ysg0LTQvtC70LbQvdGLINCx0YvRgtGMINGB0YPQv9C10YDQv9C+0LvRjNC30L7QstCw0YLQtdC70LXQvCwg0YfRgtC+0LHRiyDQuNGB0L/QvtC70YzQt9C+0LLQsNGC0Ywg0Y3RgtC+0YIg0YHQutGA0LjQv9GCLiIKKworIzogLi4vYWxzYWNvbmYuaW46Mjk0Cittc2dpZCAiRVJST1I6IFRoZSBjb25maWcgZmlsZSBkb2Vzbid0IGV4aXN0OiAiCittc2dzdHIgItCe0KjQmNCR0JrQkDog0KTQsNC50Lsg0YEg0L3QsNGB0YLRgNC+0LnQutCw0LzQuCDQvdC1INGB0YPRidC10YHRgtCy0YPQtdGCOiAiCisKKyM6IC4uL2Fsc2Fjb25mLmluOjMzNgorbXNnaWQgIkVycm9yLCBkaWFsb2cgb3Igd2hpcHRhaWwgbm90IGZvdW5kLiIKK21zZ3N0ciAi0J7RiNC40LHQutCwLCBkaWFsb2cg0LjQu9C4IHdoaXB0YWlsINC90LUg0L3QsNC50LTQtdC90YsuIgorCisjOiAuLi9hbHNhY29uZi5pbjozNDIKK21zZ2lkICJFcnJvciwgYXdrIG5vdCBmb3VuZC4gQ2FuJ3QgY29udGludWUuIgorbXNnc3RyICLQntGI0LjQsdC60LAsIGF3ayDQvdC1INC90LDQudC00LXQvS4g0J3QtSDQvNC+0LPRgyDQv9GA0L7QtNC+0LvQttC40YLRjCDRgNCw0LHQvtGC0YMuIgorCisjOiAuLi9hbHNhY29uZi5pbjo0MzkKK21zZ2lkICIiCisiXG4iCisiICAgICAgICAgICAgICAgICAgIEFMU0EgIENPTkZJR1VSQVRPUlxuIgorIiAgICAgICAgICAgICAgICAgICB2ZXJzaW9uICVzXG4iCisiXG4iCisiICAgICAgICAgICAgVGhpcyBzY3JpcHQgaXMgYSBjb25maWd1cmF0b3IgZm9yXG4iCisiICAgIEFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZSAoQUxTQSkgZHJpdmVyLlxuIgorIlxuIgorIlxuIgorIiAgSWYgQUxTQSBpcyBhbHJlYWR5IHJ1bm5pbmcsIHlvdSBzaG91bGQgY2xvc2UgYWxsIHNvdW5kXG4iCisiICBhcHBzIG5vdyBhbmQgc3RvcCB0aGUgc291bmQgZHJpdmVyLlxuIgorIiAgYWxzYWNvbmYgd2lsbCB0cnkgdG8gZG8gdGhpcywgYnV0IGl0J3Mgbm90IDEwMCUlIHN1cmUuIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICAgICAgICAgICAgINCd0LDRgdGC0YDQvtC50YnQuNC6IEFMU0FcbiIKKyIgICAgICAgICAgICAgICAgICDQstC10YDRgdC40Y8gJXNcbiIKKyJcbiIKKyIgICAg0K3RgtC+0YIg0YHQutGA0LjQv9GCINC90LDRgdGC0YDQsNC40LLQsNC10YIgQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlXG4iCisiXG4iCisiXG4iCisiICAg0JXRgdC70Lgg0LrQsNC60LjQtS3QvdC40LHRg9C00Ywg0L/RgNC40LvQvtC20LXQvdC40Y8g0LLRhdC+0LTRj9GJ0LjQtSDQsiDQv9Cw0LrQtdGCIEFMU0Eg0YPQttC1INC30LDQv9GD0YnQtdC90YssXG4iCisiICAg0LLRiyDQtNC+0LvQttC90Ysg0LfQsNC60YDRi9GC0Ywg0LLRgdC1INC/0YDQuNC70L7QttC10L3QuNGPINGA0LDQsdC+0YLQsNGO0YnQuNC1INGB0L4g0LfQstGD0LrQvtC8XG4iCisiICAg0Lgg0L7RgdGC0LDQvdC+0LLQsNC40YLRjCDQt9Cy0YPQutC+0LLQvtC5INC00YDQsNC50LLQtdGALlxuIgorIiAgIGFsc2Fjb25mINC/0L7Qv9GL0YLQsNC10YLRgdGPINGN0YLQviDRgdC00LXQu9Cw0YLRjCwg0L3QviDRgNC10LfRg9C70YzRgtCw0YIg0L3QtSDQs9Cw0YDQsNC90YLQuNGA0YPQtdGC0YHRjyDQvdCwINCy0YHQtSAxMDAlIgorIiUuIgorCisjOiAuLi9hbHNhY29uZi5pbjo0NTUKK21zZ2lkICIiCisiXG4iCisiXG4iCisiICAgICBPSywgc291bmQgZHJpdmVyIGlzIGNvbmZpZ3VyZWQuXG4iCisiXG4iCisiICAgICAgICAgICAgICAgICAgQUxTQSAgQ09ORklHVVJBVE9SXG4iCisiXG4iCisiICAgICAgICAgIHdpbGwgcHJlcGFyZSB0aGUgY2FyZCBmb3IgcGxheWluZyBub3cuXG4iCisiXG4iCisiICAgICBOb3cgSSdsbCBydW4gYWxzYXNvdW5kIGluaXQgc2NyaXB0LCB0aGVuIEknbGwgdXNlXG4iCisiICAgICBhbWl4ZXIgdG8gcmFpc2UgdGhlIGRlZmF1bHQgdm9sdW1lcy5cbiIKKyIgICAgIFlvdSBjYW4gY2hhbmdlIHRoZSB2b2x1bWUgbGF0ZXIgdmlhIGEgbWl4ZXJcbiIKKyIgICAgIHByb2dyYW0gc3VjaCBhcyBhbHNhbWl4ZXIgb3IgZ2FtaXguXG4iCisiICBcbiIKKyIgICIKK21zZ3N0ciAiIgorIlxuIgorIlxuIgorIiAgICDQpdC+0YDQvtGI0L4sINC00YDQsNC50LLQtdGAINC30LLRg9C60L7QstC+0Lkg0LrQsNGA0YLRiyDQvdCw0YHRgtGA0L7QtdC9LlxuIgorIlxuIgorIiAgICAgICAgICAgINCh0LXQudGH0LDRgSDQndCw0YHRgtGA0L7QudGJ0LjQuiBBTFNBXG4iCisiXG4iCisiICAgICAgICAg0L/QvtC00LPQvtGC0L7QstC40YIg0LfQstGD0LrQvtCy0YPRjiDQutCw0YDRgtGDINC00LvRjyDQv9GA0L7QuNCz0YDQvtCy0LDQvdC40Y8uXG4iCisiXG4iCisiICAgINCh0LXQudGH0LDRgSDRjyDQt9Cw0L/Rg9GJ0YMg0YHQutGA0LjQv9GCLCDQuNC90LjRhtC40LDQu9C40LfQuNGA0YPRjtGJ0LjQuSBhbHNhc291bmQsINC/0L7RgtC+0Lwg0LjRgdC/0L7Qu9GM0LfRg9GOICIKKyJhbWl4ZXJcbiIKKyIgICAg0LTQu9GPINGD0LLQtdC70LjRh9C10L3QuNGPINGD0YDQvtCy0L3RjyDQs9GA0L7QvNC60L7RgdGC0Lgg0L/QviDRg9C80L7Qu9GH0LDQvdC40Y8uXG4iCisiICAgINCS0Ysg0LzQvtC20LXRgtC1INC40LfQvNC10L3QuNGC0Ywg0YPRgNC+0LLQtdC90Ywg0LPRgNC+0LzQutC+0YHRgtC4INC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGPINC/0L7Qt9C20LVcbiIKKyIgICAg0YEg0L/QvtC80L7RidGM0Y4g0YLQsNC60LjRhSDQv9GA0L7Qs9GA0LDQvNC8INC60LDQuiBhbHNhbWl4ZXIg0LjQu9C4IGdhbWl4LlxuIgorIiAgIgorCisjOiAuLi9hbHNhY29uZi5pbjo1MTggLi4vYWxzYWNvbmYuaW46NTIzIC4uL2Fsc2Fjb25mLmluOjUyOCAuLi9hbHNhY29uZi5pbjo1MzMKK21zZ2lkICJDYW4ndCBjcmVhdGUgdGVtcCBmaWxlLCBleGl0aW5nLi4uIgorbXNnc3RyICLQndC1INC80L7Qs9GDINGB0L7Qt9C00LDRgtGMINCy0YDQtdC80LXQvdC90YvQuSDRhNCw0LnQuywg0L/RgNC10LrRgNCw0YnQsNGOINGA0LDQsdC+0YLRgy4uLiIKKworIzogLi4vYWxzYWNvbmYuaW46NjQzCittc2dpZCAiQnVpbGRpbmcgY2FyZCBkYXRhYmFzZS4uIgorbXNnc3RyICLQodC+0LfQtNCw0Y4g0LHQsNC30YMg0LTQsNC90L3Ri9GFINGBINC40L3RhNC+0YDQvNCw0YbQuNC10Lkg0L4g0LfQstGD0LrQvtCy0YvRhSDQutCw0YDRgtC+0YfQutCw0YUuLiIKKworIzogLi4vYWxzYWNvbmYuaW46NjQ3Cittc2dpZCAiTm8gY2FyZCBkYXRhYmFzZSBpcyBmb3VuZC4uIgorbXNnc3RyICLQkdCw0LfQsCDQtNCw0L3QvdGL0YUsINGB0L7QtNC10YDQttCw0YnQsNGPINC40L3RhNC+0YDQvNCw0YbQuNGOINC+INC30LLRg9C60L7QstGL0YUg0LrQsNGA0YLQvtGH0LrQsNGFLCDQvdC1INC90LDQudC00LXQvdCwLi4iCisKKyM6IC4uL2Fsc2Fjb25mLmluOjY1MgorbXNnaWQgIlNlYXJjaGluZyBzb3VuZCBjYXJkcyIKK21zZ3N0ciAi0JjRidC10Lwg0LfQstGD0LrQvtCy0YvQtSDQutCw0YDRgtC+0YfQutC4IgorCisjOiAuLi9hbHNhY29uZi5pbjo4MDYKK21zZ2lkICIiCisiXG4iCisiQ29uZmlndXJpbmcgJXNcbiIKKyJEbyB5b3Ugd2FudCB0byBtb2RpZnkgJXMgKGFuZCAlcyBpZiBwcmVzZW50KT8iCittc2dzdHIgIiIKKyJcbiIKKyLQndCw0YHRgtGA0LDQuNCy0LDQtdC8ICVzXG4iCisi0JLRiyDRhdC+0YLQuNGC0LUg0LjQt9C80LXQvdC40YLRjCAlcyAo0LggJXMsINC10YHQu9C4INGB0YPRidC10YHRgtCy0YPQtdGCKT8iCisKKyM6IC4uL2Fsc2Fjb25mLmluOjgxMQorbXNnaWQgIiIKKyJcbiIKKyJDb25maWd1cmluZyAlc1xuIgorIkRvIHlvdSB3YW50IHRvIG1vZGlmeSAlcz8iCittc2dzdHIgIiIKKyJcbiIKKyLQndCw0YHRgtGA0LDQuNCy0LDQtdC8ICVzXG4iCisi0JLRiyDRhdC+0YLQuNGC0LUg0LjQt9C80LXQvdC40YLRjCAlcz8iCisKKyM6IC4uL2Fsc2Fjb25mLmluOjkwMAorbXNnaWQgIlJ1bm5pbmcgbW9kdWxlcy11cGRhdGUuLi4iCittc2dzdHIgItCX0LDQv9GD0YHQutCw0LXQvCBtb2R1bGVzLXVwZGF0ZS4uLiIKKworIzogLi4vYWxzYWNvbmYuaW46OTAzCittc2dpZCAiUnVubmluZyB1cGRhdGUtbW9kdWxlcy4uLiIKK21zZ3N0ciAi0JfQsNC/0YPRgdC60LDQtdC8IHVwZGF0ZS1tb2R1bGVzLi4uIgorCisjOiAuLi9hbHNhY29uZi5pbjo5MTUKK21zZ2lkICIiCisiXG4iCisiICAgICAgIFRoZSBtaXhlciBpcyBzZXQgdXAgbm93IGZvciBmb3IgcGxheWluZy5cbiIKKyIgICAgICAgU2hhbGwgSSB0cnkgdG8gcGxheSBhIHNvdW5kIHNhbXBsZSBub3c/XG4iCisiXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9URTpcbiIKKyJJZiB5b3UgaGF2ZSBhIGJpZyBhbXBsaWZpZXIsIGxvd2VyIHlvdXIgdm9sdW1lcyBvciBzYXkgbm8uXG4iCisiICAgIE90aGVyd2lzZSBjaGVjayB0aGF0IHlvdXIgc3BlYWtlciB2b2x1bWUgaXMgb3BlbixcbiIKKyIgICAgICAgICAgYW5kIGxvb2sgaWYgeW91IGNhbiBoZWFyIHRlc3Qgc291bmQuXG4iCittc2dzdHIgIiIKKyJcbiIKKyIgICAgICAg0JzQuNC60YjQtdGAINC90LDRgdGC0YDQvtC10L0g0LTQu9GPINC/0YDQvtC40LPRgNC+0LLQvtCy0LDQvdC40Y8uXG4iCisiICAgICAgINCf0YDQvtC40LPRgNCw0YLRjCDRgtC10YHRgtC+0LLRi9C5INC/0YDQuNC80LXRgD9cbiIKKyJcbiIKKyIgINCf0YDQuNC80LXRh9Cw0L3QuNC1OlxuIgorIiAg0JXRgdC70Lgg0YMg0LLQsNGBINCx0L7Qu9GM0YjQvtC5INGD0YHQuNC70LjRgtC10LvRjCwg0YPQvNC10L3RjNGI0LjRgtC1INGD0YDQvtCy0LXQvdGMINCz0YDQvtC80LrQvtGB0YLQuCDQuNC70Lgg0YHQutCw0LbQuNGC0LUgIgorItC90LXRgi5cbiIKKyIgINCSINC/0YDQvtGC0LjQstC90L7QvCDRgdC70YPRh9Cw0LUg0L/RgNC+0LLQtdGA0YzRgtC1LCDRh9GC0L4g0LLQsNGI0Lgg0LrQvtC70L7QvdC60Lgg0LLQutC70Y7Rh9C10L3RiyxcbiIKKyIgINC4INGD0LTQvtGB0YLQvtCy0LXRgNGM0YLQtdGB0Ywg0YfRgtC+INCy0Ysg0YHQu9GL0YjQuNGC0LUg0YLQtdGB0YLQvtCy0YvQuSDQv9GA0LjQvNC10YAuXG4iCisKKyM6IC4uL2Fsc2Fjb25mLmluOjkzMgorbXNnaWQgIlNhdmluZyB0aGUgbWl4ZXIgc2V0dXAgdXNlZCBmb3IgdGhpcyBpbiAvZXRjL2Fzb3VuZC5zdGF0ZS4iCittc2dzdHIgItCh0L7RhdGA0LDQvdGP0LXQvCDQvdCw0YHRgtGA0L7QudC60Lgg0LzQuNC60YjQtdGA0LAg0LIgL2V0Yy9hc291bmQuc3RhdGUuIgorCisjOiAuLi9hbHNhY29uZi5pbjo5MzYKK21zZ2lkICIiCisiXG4iCisiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgorIlxuIgorIiBOb3cgQUxTQSBpcyByZWFkeSB0byB1c2UuXG4iCisiIEZvciBhZGp1c3RtZW50IG9mIHZvbHVtZXMsIHVzZSB5b3VyIGZhdm9yaXRlIG1peGVyLlxuIgorIlxuIgorIiBIYXZlIGEgbG90IG9mIGZ1biFcbiIKKyJcbiIKK21zZ3N0ciAiIgorIlxuIgorIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKKyJcbiIKKyIg0KLQtdC/0LXRgNGMIEFMU0Eg0LPQvtGC0L7QstCwINC6INC40YHQv9C+0LvRjNC30L7QstCw0L3QuNGOLlxuIgorIiDQlNC70Y8g0YDQtdCz0YPQu9C40YDQvtCy0LrQuCDRg9GA0L7QstC90Y8g0LPRgNC+0LzQutC+0YHRgtC4LCDQuNGB0L/QvtC70YzQt9GD0LnRgtC1INCy0LDRiCDQu9GO0LHQuNC80YvQuSDQvNC40LrRiNC10YAuXG4iCisiXG4iCisiINCe0YLQvtGA0LLQuNGB0Ywg0L/QviDQv9C+0LvQvdC+0LkhXG4iCisiXG4iCisKKyM6IC4uL2Fsc2Fjb25mLmluOjEyNDQKK21zZ2lkICJXQVJOSU5HIgorbXNnc3RyICLQn9Cg0JXQlNCj0J/QoNCV0JbQlNCV0J3QmNCVIgorCisjOiAuLi9hbHNhY29uZi5pbjoxMjQ1Cittc2dpZCAiIgorIlxuIgorIiAgIFByb2JpbmcgbGVnYWN5IElTQSBjYXJkcyBtaWdodCBtYWtlXG4iCisiICAgeW91ciBzeXN0ZW0gdW5zdGFibGUuXG4iCisiXG4iCisiICAgICAgICBEbyB5b3Ugd2FudCB0byBwcm9jZWVkP1xuIgorIlxuIgorbXNnc3RyICIiCisiXG4iCisiICDQn9C+0LjRgdC6IElTQSDQt9Cy0YPQutC+0LLRi9GFINC60LDRgNGC0L7Rh9C10Log0LzQvtC20LXRgiDRgdC00LXQu9Cw0YLRjFxuIgorIiAg0LLQsNGI0YMg0YHQuNGB0YLQtdC80YMg0L3QtdGB0YLQsNCx0LjQu9GM0L3QvtC5LlxuIgorIlxuIgorIiAg0JLRiyDRg9Cy0LXRgNC10L3Riz9cbiIKKyJcbiIKKworIzogLi4vYWxzYWNvbmYuaW46MTI2OAorbXNnaWQgIiIKKyJObyBsZWdhY3kgZHJpdmVycyBhcmUgYXZhaWxhYmxlXG4iCisiICAgZm9yIHlvdXIgbWFjaGluZSIKK21zZ3N0ciAiIgorItCd0LXRgtGDINC/0L7QtNGF0L7QtNGP0YjQtdCz0L4g0LTRgNCw0LnQstC10YDQsCDQtNC70Y9cbiIKKyIgINCy0LDRiNC10Lkg0LzQsNGI0LjQvdGLIgorCisjOiAuLi9hbHNhY29uZi5pbjoxMjczCittc2dpZCAiRHJpdmVyIFNlbGVjdGlvbiIKK21zZ3N0ciAi0JLRi9Cx0L7RgCDQlNGA0LDQudCy0LXRgNCwIgorCisjOiAuLi9hbHNhY29uZi5pbjoxMjc0Cittc2dpZCAiIgorIiAgICAgICAgICAgUHJvYmluZyBsZWdhY3kgSVNBIGNhcmRzXG4iCisiXG4iCisiICAgICAgICBQbGVhc2Ugc2VsZWN0IHRoZSBkcml2ZXJzIHRvIHByb2JlOiIKK21zZ3N0ciAiIgorIiAgICDQn9C+0LjRgdC6IElTQSDQt9Cy0YPQutC+0LLRi9GFINC60LDRgNGCXG4iCisiXG4iCisiICAgINCf0L7QttCw0LvRg9C50YHRgtCwLCDQstGL0LHQtdGA0LjRgtC1INC00YDQsNC50LLQtdGA0Ysg0LTQu9GPINC/0YDQvtCy0LXRgNC60Lg6IgorCisjOiAuLi9hbHNhY29uZi5pbjoxMjgxCittc2dpZCAiIgorIlxuIgorIiBTaGFsbCBJIHRyeSBhbGwgcG9zc2libGUgRE1BIGFuZCBJUlEgY29tYmluYXRpb25zP1xuIgorIiBXaXRoIHRoaXMgb3B0aW9uLCBzb21lIHVuY29udmVudGlvbmFsIGNvbmZpZ3VyYXRpb25cbiIKKyIgbWlnaHQgYmUgZm91bmQsIGJ1dCBpdCB3aWxsIHRha2UgbXVjaCBsb25nZXIgdGltZS4iCittc2dzdHIgIiIKKyJcbiIKKyIg0J/QvtC/0YDQvtCx0L7QstCw0YLRjCDQstGB0LUg0LTQvtGB0YLRg9C/0L3Ri9C1IERNQSDQuCBJUlEg0LrQvtC80LHQuNC90LDRhtC40Lg/XG4iCisiINChINGN0YLQvtC5INC+0L/RhtC40LXQuSwg0LzQvtCz0YPRgiDQsdGL0YLRjCDQvdCw0LnQtNC10L3RiyDQvdC10LrQvtGC0L7RgNGL0LUg0L3QtdGB0YLQsNC90LTQsNGA0YLQvdGL0LVcbiIKKyIg0LrQvtC90YTQuNCz0YPRgNCw0LjQuCwg0L3QviDRjdGC0L4g0LfQsNC50LzQtdGCINC90LDQvNC90L7Qs9C+INCx0L7Qu9GM0YjQtSDQstGA0LXQvNC10L3QuC4iCisKKyM6IC4uL2Fsc2Fjb25mLmluOjEyOTEKK21zZ2lkICJQcm9iaW5nIGxlZ2FjeSBjYXJkcy4uICAgVGhpcyBtYXkgdGFrZSBhIGZldyBtaW51dGVzLi4iCittc2dzdHIgItCf0L7QuNGB0Log0LfQstGD0LrQvtCy0YvRhSDQutCw0YDRgtC+0YfQtdC6Li4gINCt0YLQviDQvNC+0LbQtdGCINC30LDQvdGP0YLRjCDQvdC10YHQutC+0LvRjNC60L4g0LzQuNC90YPRgi4uIgorCisjOiAuLi9hbHNhY29uZi5pbjoxMjkyCittc2dpZCAiUHJvYmluZzogIgorbXNnc3RyICLQn9GA0L7QstC10YDQutCwOiAiCisKKyM6IC4uL2Fsc2Fjb25mLmluOjEyOTgKK21zZ2lkICIgOiBGT1VORCEhIgorbXNnc3RyICIgOiDQndCQ0KjQldCbISEiCisKKyM6IC4uL2Fsc2Fjb25mLmluOjEzMDQKK21zZ2lkICJSZXN1bHQiCittc2dzdHIgItCg0LXQt9GD0LvRjNGC0LDRgiIKKworIzogLi4vYWxzYWNvbmYuaW46MTMwNQorbXNnaWQgIk5vIGxlZ2FjeSBjYXJkcyBmb3VuZCIKK21zZ3N0ciAi0JfQstGD0LrQvtCy0YvRhSDQutCw0YDRgtC+0YfQtdC6INC90LUg0L3QsNC50LTQtdC90L4iCisKKyM6IC4uL2Fsc2Fjb25mLmluOjEzNjQKK21zZ2lkICIiCisiXG4iCisiIExvb2tzIGxpa2UgeW91IGhhdmluZyBhIFRoaW5rcGFkIDYwMEUgb3IgNzcwIG5vdGVib29rLlxuIgorIiBPbiB0aGlzIG5vdGVib29rLCBDUzQyMzYgZHJpdmVyIHNob3VsZCBiZSB1c2VkXG4iCisiIGFsdGhvdWdoIENTNDZ4eCBjaGlwIGlzIGRldGVjdGVkLlxuIgorIlxuIgorIiBTaGFsbCBJIHRyeSB0byBzbmQtY3M0MjM2IGRyaXZlciBhbmQgcHJvYmVcbiIKKyIgdGhlIGxlZ2FjeSBJU0EgY29uZmlndXJhdGlvbj8iCittc2dzdHIgIiIKKyJcbiIKKyIg0JrQsNC20LXRgtGB0Y8sINC80Ysg0LjQvNC10LXQvCDQtNC10LvQviDRgSDQvdC+0YPRgtCx0YPQutC+0LwgVGhpbmtwYWQgNjAwRSDQuNC70LggNzcwLlxuIgorIiDQndCwINGN0YLQvtC8INC90L7Rg9GC0LHRg9C60LUsINC00YDQsNC50LLQtdGAIENTNDIzNiDQtNC+0LvQttC10L0g0LjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGM0YHRj1xuIgorIiDRhdC+0YLRjyDQvtC/0YDQtdC00LXQu9GP0LXRgtGB0Y8gQ1M0Nnh4XG4iCisiXG4iCisiINCY0YHQv9C+0LvRjNC30L7QstCw0YLRjCBzbmQtY3M0MjM2INC4INC/0YDQvtCy0LXRgNC40YLRjCDQv9GA0LDQstC40LvRjNC90L7RgdGC0YwgSVNBXG4iCisiINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQuD8iCisKKyM6IC4uL2Fsc2Fjb25mLmluOjEzNzgKK21zZ2lkICIiCisiXG4iCisiIExvb2tzIGxpa2UgeW91IGhhdmluZyBhIERlbGwgRGltZW5zaW9uIG1hY2hpbmUuXG4iCisiIE9uIHRoaXMgbWFjaGluZSwgQ1M0MjMyIGRyaXZlciBzaG91bGQgYmUgdXNlZFxuIgorIiBhbHRob3VnaCBDUzQ2eHggY2hpcCBpcyBkZXRlY3RlZC5cbiIKKyJcbiIKKyIgU2hhbGwgSSB0cnkgdG8gc25kLWNzNDIzMiBkcml2ZXIgYW5kIHByb2JlXG4iCisiIHRoZSBsZWdhY3kgSVNBIGNvbmZpZ3VyYXRpb24/IgorbXNnc3RyICIiCisiXG4iCisiINCf0L7RhdC+0LbQtSDRh9GC0L4g0LLRiyDQuNC80LXQtdC8INC00LXQu9C+INGBINC80LDRiNC40L3QvtC5IERlbGwgRGltZW5zaW9uLlxuIgorIiDQndCwINGN0YLQvtC5INC80LDRiNC40L3QtSBDUzQyMzIg0LTRgNCw0LnQstC10YAg0LTQvtC70LbQtdC9INC40YHQv9C+0LvQt9GM0L7QstCw0YLRjCwg44OB44OD44OX44GM5qSc5Ye644GV44KM44G+44GZ44GMXG4iCisiINGF0L7RgtGPINGH0LjQvyDQt9Cy0YPQutC+0LLQvtC5INC60LDRgNGC0Ysg0L7Qv9GA0LXQtNC10LvRj9C10YLRgdGPINC60LDQuiBDUzQ2eHguXG4iCisiXG4iCisiINCY0YHQv9C+0LvRjNC30L7QstCw0YLRjCBzbmQtY3M0MjMyINC4INC/0YDQvtCy0LXRgNC40YLRjCBJU0Eg0LLQsNC70LjQtNC90L7RgdGC0YxcbiIKKyIg0Y3RgtC+0Lkg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC4PyIKKworIzogLi4vYWxzYWNvbmYuaW46MTM5NQorbXNnaWQgIlNvdW5kY2FyZCBTZWxlY3Rpb24iCittc2dzdHIgItCS0YvQsdC+0YAg0JfQstGD0LrQvtCy0L7QuSDQutCw0YDRgtGLIgorCisjOiAuLi9hbHNhY29uZi5pbjoxMzk2Cittc2dpZCAiIgorIlxuIgorIiAgICAgICAgIEZvbGxvd2luZyBjYXJkKHMpIGFyZSBmb3VuZCBvbiB5b3VyIHN5c3RlbS5cbiIKKyIgICAgICAgICBDaG9vc2UgYSBzb3VuZGNhcmQgdG8gY29uZmlndXJlOlxuIgorbXNnc3RyICIiCisiXG4iCisiICAgICAgICDQodC70LXQtNGD0YnQtdC1INC30LLRg9C60L7QstCw0Y8o0YvQtSkg0LrQsNGA0YLQsCjRiykg0L3QsNC50LTQtdC90Ysg0LIg0LLQsNGI0LXQuSDRgdC40YHRgtC10LzQtS5cbiIKKyIgICAgICAgINCS0YvQsdC10YDQuNGC0LUg0LfQstGD0LrQvtCy0YPRjiDQutCw0YDRgtGDINC00LvRjyDQvdCw0YHRgtGA0L7QudC60Lg6XG4iCisKKyM6IC4uL2Fsc2Fjb25mLmluOjE0MDkKK21zZ2lkICIiCisiXG4iCisiICAgICAgICBObyBzdXBwb3J0ZWQgUG5QIG9yIFBDSSBjYXJkIGZvdW5kLlxuIgorIlxuIgorIiBXb3VsZCB5b3UgbGlrZSB0byBwcm9iZSBsZWdhY3kgSVNBIHNvdW5kIGNhcmRzL2NoaXBzP1xuIgorIlxuIgorbXNnc3RyICIiCisiXG4iCisiICAg0J3QsNC50LTQtdC90LAg0L3QtSDQv9C+0LTQtNC10YDQttC40LLQsNC10LzQsNGPIFBuUCDQuNC70LggUENJINC60LDRgNGC0LAuXG4iCisiXG4iCisiINCW0LXQu9Cw0LXRgtC1INC/0YDQvtCy0LXRgNC40YLRjCBJU0Eg0LfQstGD0LrQvtCy0YvQtSDQutCw0YDRgtGLL9GH0LjQv9GLP1xuIgorIlxuIgpkaWZmIC0tZ2l0IGEvYWxzYWN0bC8uZ2l0aWdub3JlIGIvYWxzYWN0bC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YWIzYTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbHNhY3RsLy5naXRpZ25vcmUKQEAgLTAsMCArMSwzIEBACithbHNhLXN0b3JlLnNlcnZpY2UKK2Fsc2EtcmVzdG9yZS5zZXJ2aWNlCis5MC1hbHNhLXJlc3RvcmUucnVsZXMKZGlmZiAtLWdpdCBhL2Fsc2FjdGwvOTAtYWxzYS1yZXN0b3JlLnJ1bGVzLmluIGIvYWxzYWN0bC85MC1hbHNhLXJlc3RvcmUucnVsZXMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJjZWU1YgotLS0gL2Rldi9udWxsCisrKyBiL2Fsc2FjdGwvOTAtYWxzYS1yZXN0b3JlLnJ1bGVzLmluCkBAIC0wLDAgKzEsMiBAQAorQUNUSU9OPT0iYWRkIiwgU1VCU1lTVEVNPT0ic291bmQiLCBLRVJORUw9PSJjb250cm9sQyoiLCBLRVJORUxTPT0iY2FyZCoiLCBcCisgICAgICAgIFJVTis9IkBzYmluZGlyQC9hbHNhY3RsIHJlc3RvcmUgJGF0dHJ7bnVtYmVyfSIKZGlmZiAtLWdpdCBhL2Fsc2FjdGwvTWFrZWZpbGUuYW0gYi9hbHNhY3RsL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MzRlNDQKLS0tIC9kZXYvbnVsbAorKysgYi9hbHNhY3RsL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNTkgQEAKK1NVQkRJUlMgPSBpbml0CisKK3NiaW5fUFJPR1JBTVM9YWxzYWN0bAorbWFuX01BTlM9YWxzYWN0bC4xCitpZiBVU0VfWE1MVE8KK21hbl9NQU5TICs9IGFsc2FjdGxfaW5pdC43CitlbmRpZgorRVhUUkFfRElTVD1hbHNhY3RsLjEgYWxzYWN0bF9pbml0LnhtbAorCithbHNhY3RsX1NPVVJDRVM9YWxzYWN0bC5jIHN0YXRlLmMgdXRpbHMuYyBpbml0X3BhcnNlLmMKK2Fsc2FjdGxfQ0ZMQUdTPSQoQU1fQ0ZMQUdTKSAtRFNZU19BU09VTkRSQz1cIiQoQVNPVU5EX1NUQVRFX0RJUikvYXNvdW5kLnN0YXRlXCIKK25vaW5zdF9IRUFERVJTPWFsc2FjdGwuaCBsaXN0LmggaW5pdF9zeXNkZXBzLmMgaW5pdF91dGlsc19zdHJpbmcuYyBpbml0X3V0aWxzX3J1bi5jIGluaXRfc3lzZnMuYworCitkaXN0X3VkZXZydWxlc19EQVRBID0gXAorCTkwLWFsc2EtcmVzdG9yZS5ydWxlcworCitpZiBIQVZFX1NZU1RFTUQKKworc3lzdGVtZHN5c3RlbXVuaXRfREFUQSA9IFwKKwlhbHNhLXN0b3JlLnNlcnZpY2UgXAorCWFsc2EtcmVzdG9yZS5zZXJ2aWNlCisKK2luc3RhbGwtZGF0YS1ob29rOgorCSQoTUtESVJfUCkgLW0gMDc1NSBcCisJCSQoREVTVERJUikkKHN5c3RlbWRzeXN0ZW11bml0ZGlyKS9iYXNpYy50YXJnZXQud2FudHMgXAorCQkkKERFU1RESVIpJChzeXN0ZW1kc3lzdGVtdW5pdGRpcikvc2h1dGRvd24udGFyZ2V0LndhbnRzCisJKCBjZCAkKERFU1RESVIpJChzeXN0ZW1kc3lzdGVtdW5pdGRpcikvYmFzaWMudGFyZ2V0LndhbnRzICYmIFwKKwkgICAgICAgIHJtIC1mIGFsc2EtcmVzdG9yZS5zZXJ2aWNlICYmIFwKKwkJJChMTl9TKSAuLi9hbHNhLXJlc3RvcmUuc2VydmljZSBhbHNhLXJlc3RvcmUuc2VydmljZSApCisJKCBjZCAkKERFU1RESVIpJChzeXN0ZW1kc3lzdGVtdW5pdGRpcikvc2h1dGRvd24udGFyZ2V0LndhbnRzICYmIFwKKwkgICAgICAgIHJtIC1mIGFsc2Etc3RvcmUuc2VydmljZSAmJiBcCisJCSQoTE5fUykgLi4vYWxzYS1zdG9yZS5zZXJ2aWNlIGFsc2Etc3RvcmUuc2VydmljZSApCisKK2VuZGlmCisKK2VkaXQgPSBcCisJJChTRUQpIC1yICdzLEBzYmluZGlyXEAsJChzYmluZGlyKSxnJyA8ICQ8ID4gJEAgfHwgcm0gJEAKKworYWxzYS1zdG9yZS5zZXJ2aWNlOiBhbHNhLXN0b3JlLnNlcnZpY2UuaW4KKwkkKGVkaXQpCisKK2Fsc2EtcmVzdG9yZS5zZXJ2aWNlOiBhbHNhLXJlc3RvcmUuc2VydmljZS5pbgorCSQoZWRpdCkKKworOTAtYWxzYS1yZXN0b3JlLnJ1bGVzOiA5MC1hbHNhLXJlc3RvcmUucnVsZXMuaW4KKwkkKGVkaXQpCisKK0VYVFJBX0RJU1QgKz0gXAorCWFsc2Etc3RvcmUuc2VydmljZS5pbiBcCisJYWxzYS1yZXN0b3JlLnNlcnZpY2UuaW4gXAorCTkwLWFsc2EtcmVzdG9yZS5ydWxlcy5pbgorCitDTEVBTkZJTEVTID0gXAorCWFsc2Etc3RvcmUuc2VydmljZSBcCisJYWxzYS1yZXN0b3JlLnNlcnZpY2UgXAorCTkwLWFsc2EtcmVzdG9yZS5ydWxlcworCislLjc6ICUueG1sCisJeG1sdG8gbWFuICQ/CmRpZmYgLS1naXQgYS9hbHNhY3RsL2Fsc2EtcmVzdG9yZS5zZXJ2aWNlLmluIGIvYWxzYWN0bC9hbHNhLXJlc3RvcmUuc2VydmljZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTdkMTk2Ci0tLSAvZGV2L251bGwKKysrIGIvYWxzYWN0bC9hbHNhLXJlc3RvcmUuc2VydmljZS5pbgpAQCAtMCwwICsxLDExIEBACitbVW5pdF0KK0Rlc2NyaXB0aW9uPVJlc3RvcmUgU291bmQgQ2FyZCBTdGF0ZQorRGVmYXVsdERlcGVuZGVuY2llcz1ubworQWZ0ZXI9c3lzaW5pdC50YXJnZXQKK0JlZm9yZT1zaHV0ZG93bi50YXJnZXQKK0NvbmZsaWN0cz1zaHV0ZG93bi50YXJnZXQKKworW1NlcnZpY2VdCitUeXBlPW9uZXNob3QKK0V4ZWNTdGFydD0tQHNiaW5kaXJAL2Fsc2FjdGwgcmVzdG9yZQorU3RhbmRhcmRPdXRwdXQ9c3lzbG9nCmRpZmYgLS1naXQgYS9hbHNhY3RsL2Fsc2Etc3RvcmUuc2VydmljZS5pbiBiL2Fsc2FjdGwvYWxzYS1zdG9yZS5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMjgyM2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbHNhY3RsL2Fsc2Etc3RvcmUuc2VydmljZS5pbgpAQCAtMCwwICsxLDkgQEAKK1tVbml0XQorRGVzY3JpcHRpb249U3RvcmUgU291bmQgQ2FyZCBTdGF0ZQorRGVmYXVsdERlcGVuZGVuY2llcz1ubworQmVmb3JlPXNodXRkb3duLnRhcmdldAorCitbU2VydmljZV0KK1R5cGU9b25lc2hvdAorRXhlY1N0YXJ0PUBzYmluZGlyQC9hbHNhY3RsIHN0b3JlCitTdGFuZGFyZE91dHB1dD1zeXNsb2cKZGlmZiAtLWdpdCBhL2Fsc2FjdGwvYWxzYWN0bC4xIGIvYWxzYWN0bC9hbHNhY3RsLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI1OTY4YwotLS0gL2Rldi9udWxsCisrKyBiL2Fsc2FjdGwvYWxzYWN0bC4xCkBAIC0wLDAgKzEsMTE4IEBACisuVEggQUxTQUNUTCAxICIxNSBNYXkgMjAwMSIKKy5TSCBOQU1FCithbHNhY3RsIFwtIGFkdmFuY2VkIGNvbnRyb2xzIGZvciBBTFNBIHNvdW5kY2FyZCBkcml2ZXIKKworLlNIIFNZTk9QU0lTCisKK1xmQmFsc2FjdGxcZlAgW1xmSW9wdGlvbnNcZlBdIFtcZklzdG9yZVxmUHxcZklyZXN0b3JlXGZQfFxmSWluaXRcZlBdIDxjYXJkICMgb3IgaWQgb3IgZGV2aWNlPgorCisuU0ggREVTQ1JJUFRJT04KK1xmQmFsc2FjdGxcZlAgaXMgdXNlZCB0byBjb250cm9sIGFkdmFuY2VkIHNldHRpbmdzIGZvciB0aGUgQUxTQQorc291bmRjYXJkIGRyaXZlcnMuIEl0IHN1cHBvcnRzIG11bHRpcGxlIHNvdW5kY2FyZHMuIElmIHlvdXIgY2FyZCBoYXMKK2ZlYXR1cmVzIHRoYXQgeW91IGNhbid0IHNlZW0gdG8gY29udHJvbCBmcm9tIGEgbWl4ZXIgYXBwbGljYXRpb24sCit5b3UgaGF2ZSBjb21lIHRvIHRoZSByaWdodCBwbGFjZS4KKworLlNIIENPTU1BTkRTCisKK1xmSXN0b3JlXGZQIHNhdmVzIHRoZSBjdXJyZW50IGRyaXZlciBzdGF0ZSBmb3IgdGhlIHNlbGVjdGVkIHNvdW5kY2FyZAordG8gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKworXGZJcmVzdG9yZVxmUCBsb2FkcyBkcml2ZXIgc3RhdGUgZm9yIHRoZSBzZWxlY3RlZCBzb3VuZGNhcmQgZnJvbSB0aGUKK2NvbmZpZ3VyYXRpb24gZmlsZS4gSWYgcmVzdG9yaW5nIGZhaWxzIChldmVudHVhbGx5IHBhcnRseSksIHRoZSBpbml0CithY3Rpb24gaXMgY2FsbGVkLgorCitcZklpbml0XGZQIHRyaWVzIHRvIGluaXRpYWxpemUgYWxsIGRldmljZXMgdG8gYSBkZWZhdWx0IHN0YXRlLiBJZiBkZXZpY2UKK2lzIG5vdCBrbm93biwgZXJyb3IgY29kZSA5OSBpcyByZXR1cm5lZC4KKworSWYgbm8gc291bmRjYXJkcyBhcmUgc3BlY2lmaWVkLCBzZXR1cCBmb3IgYWxsIGNhcmRzIHdpbGwgYmUgc2F2ZWQgb3IKK2xvYWRlZC4KKworLlNIIE9QVElPTlMKKworLlRQCitcZklcLWgsIFwtXC1oZWxwXGZQIAorSGVscDogc2hvdyBhdmFpbGFibGUgZmxhZ3MgYW5kIGNvbW1hbmRzLgorCisuVFAKK1xmSVwtZCwgXC1cLWRlYnVnXGZQCitVc2UgZGVidWcgbW9kZTogYSBiaXQgbW9yZSB2ZXJib3NlLgorCisuVFAKK1xmSVwtdiwgXC1cLXZlcnNpb25cZlAKK1ByaW50IGFsc2FjdGwgdmVyc2lvbiBudW1iZXIuCisKKy5UUAorXGZJXC1mLCBcLVwtZmlsZVxmUAorU2VsZWN0IHRoZSBjb25maWd1cmF0aW9uIGZpbGUgdG8gdXNlLiBUaGUgZGVmYXVsdCBpcyAvdmFyL2xpYi9hbHNhL2Fzb3VuZC5zdGF0ZS4KKworLlRQCitcZklcLUYsIFwtXC1mb3JjZVxmUAorVXNlZCB3aXRoIHJlc3RvcmUgY29tbWFuZC4gIFRyeSB0byByZXN0b3JlIHRoZSBtYXRjaGluZyBjb250cm9sIGVsZW1lbnRzCithcyBtdWNoIGFzIHBvc3NpYmxlLiAgVGhpcyBvcHRpb24gaXMgc2V0IGFzIGRlZmF1bHQgbm93LgorCisuVFAKK1xmSVwtZywgXC1cLWlnbm9yZVxmUAorVXNlZCB3aXRoIHN0b3JlIGFuZCByZXN0b3JlIGNvbW1hbmRzLiBEbyBub3Qgc2hvdyAnTm8gc291bmRjYXJkcyBmb3VuZCcKK2FuZCBkbyBub3Qgc2V0IGFuIGVycm9yIGV4aXQgY29kZSB3aGVuIHNvdW5kY2FyZHMgYXJlIG5vdCBpbnN0YWxsZWQuCisKKy5UUAorXGZJXC1QLCBcLVwtcGVkYW50aWNcZlAKK1VzZWQgd2l0aCByZXN0b3JlIGNvbW1hbmQuICBEb24ndCByZXN0b3JlIG1pc21hdGNoaW5nIGNvbnRyb2wgZWxlbWVudHMuCitUaGlzIG9wdGlvbiB3YXMgdGhlIG9sZCBkZWZhdWx0IGJlaGF2aW9yLgorCisuVFAKK1xmSVwtSSwgXC1cLW5vXC1pbml0XC1mYWxsYmFja1xmUAorRG9uJ3QgaW5pdGlhbGl6ZSBjYXJkcyBpZiByZXN0b3JlIGZhaWxzLiAgU2luY2UgdmVyc2lvbiAxLjAuMTgsCitcZkJhbHNhY3RsXGZQIHRyaWVzIHRvIGluaXRpYWxpemUgdGhlIGNhcmQgd2l0aCB0aGUgcmVzdG9yZSBvcGVyYXRpb24KK2FzIGRlZmF1bHQuICBCdXQgdGhpcyBjYW4gY2F1c2UgaW5jb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZGVyIHZlcnNpb24uCitUaGUgY2FsbGVyIG1heSBleHBlY3QgdGhhdCB0aGUgc3RhdGUgd29uJ3QgYmUgdG91Y2hlZCBpZiBubyBzdGF0ZSBmaWxlCitleGlzdHMuICBUaGlzIG9wdGlvbiB0YWtlcyB0aGUgcmVzdG9yZSBiZWhhdmlvciBiYWNrIHRvIHRoZSBvbGRlcgordmVyc2lvbiBieSBzdXBwcmVzc2luZyB0aGUgaW5pdGlhbGl6YXRpb24uCisKKy5UUAorXGZJXC1yLCBcLVwtcnVuc3RhdGVcZlAKK1NhdmUgcmVzdG9yZSBhbmQgaW5pdCBzdGF0ZSB0byB0aGlzIGZpbGUuIFRoZSBmaWxlIHdpbGwgY29udGFpbiBvbmx5IGVycm9ycy4KK0Vycm9ycyBhcmUgYXBwZW5kZWQgd2l0aCB0aGUgc291bmRjYXJkIGlkIHRvIHRoZSBlbmQgb2YgZmlsZS4KKworLlRQCitcZklcLVIsIFwtXC1yZW1vdmVcZlAKK1JlbW92ZSBydW5zdGF0ZSBmaWxlIGF0IGZpcnN0LgorCisuVFAKK1xmSVwtRSwgXC1cLWVudlxmUCAjPSMKK1NldCBlbnZpcm9ubWVudCB2YXJpYWJsZSAodXNlZnVsIGZvciBpbml0IGFjdGlvbiBvciB5b3UgbWF5IG92ZXJyaWRlCitBTFNBX0NPTkZJR19QQVRIIHRvIHJlYWQgZGlmZmVyZW50IG9yIG9wdGltaXplZCBjb25maWd1cmF0aW9uIC0gbWF5IGJlCit1c2VmdWwgZm9yICJib290IiBzY3JpcHRzKS4KKworLlRQCitcZklcLWksIFwtXC1pbml0ZmlsZVxmUCAjPSMKK1RoZSBjb25maWd1cmF0aW9uIGZpbGUgZm9yIGluaXQuIEJ5IGRlZmF1bHQsIFBSRUZJWC9zaGFyZS9hbHNhL2luaXQvMDBtYWluCitpcyB1c2VkLgorCisuU0ggRklMRVMKK1xmSS92YXIvbGliL2Fsc2EvYXNvdW5kLnN0YXRlXGZQIChvciB3aGF0ZXZlciBmaWxlIHlvdSBzcGVjaWZ5IHdpdGggdGhlCitcZkJcLWZcZlAgZmxhZykgaXMgdXNlZCB0byBzdG9yZSBjdXJyZW50IHNldHRpbmdzIGZvciB5b3VyCitzb3VuZGNhcmRzLiBUaGUgc2V0dGluZ3MgaW5jbHVkZSBhbGwgdGhlIHVzdWFsIHNvdW5kY2FyZCBtaXhlcgorc2V0dGluZ3MuICBNb3JlIGltcG9ydGFudGx5LCBhbHNhY3RsIGlzCitjYXBhYmxlIG9mIGNvbnRyb2xsaW5nIG90aGVyIGNhcmQtc3BlY2lmaWMgZmVhdHVyZXMgdGhhdCBtaXhlciBhcHBzCit1c3VhbGx5IGRvbid0IGtub3cgYWJvdXQuCisKK1RoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgcnVubmluZworXGZCYWxzYWN0bCBzdG9yZVxmUC4gRWRpdGluZyB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGJ5IGhhbmQgbWF5IGJlCituZWNlc3NhcnkgZm9yIHNvbWUgc291bmRjYXJkIGZlYXR1cmVzIChlLmcuIGVuYWJsaW5nL2Rpc2FibGluZworYXV0b21hdGljIG1pYyBnYWluLCBkaWdpdGFsIG91dHB1dCwgam95c3RpY2svZ2FtZSBwb3J0cywgc29tZSBmdXR1cmUgTUlESQorcm91dGluZyBvcHRpb25zLCBldGMpLgorCisuU0ggU0VFIEFMU08KK1xmQgorYW1peGVyKDEpLAorYWxzYW1peGVyKDEpLAorYXBsYXkoMSkKK1xmUAorCisuU0ggQlVHUyAKK05vbmUga25vd24uCisKKy5TSCBBVVRIT1IKK1xmQmFsc2FjdGxcZlAgaXMgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4gYW5kIEFicmFtbyBCYWduYXJhCis8YWJyYW1vQGFsc2FcLXByb2plY3Qub3JnPi4gVGhpcyBkb2N1bWVudCBpcyBieSBQYXVsIFdpbmtsZXIgPHphcm16YXJtQGVyb2xzLmNvbT4uCmRpZmYgLS1naXQgYS9hbHNhY3RsL2Fsc2FjdGwuYyBiL2Fsc2FjdGwvYWxzYWN0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OTI3NDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbHNhY3RsL2Fsc2FjdGwuYwpAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqICBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUgQ29udHJvbCBQcm9ncmFtCisgKiAgQ29weXJpZ2h0IChjKSBieSBBYnJhbW8gQmFnbmFyYSA8YWJyYW1vQGFsc2EtcHJvamVjdC5vcmc+CisgKiAgICAgICAgICAgICAgICAgICBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICoKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlICJhY29uZmlnLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxhbHNhL2Fzb3VuZGxpYi5oPgorI2luY2x1ZGUgImFsc2FjdGwuaCIKKworI2lmbmRlZiBTWVNfQVNPVU5EUkMKKyNkZWZpbmUgU1lTX0FTT1VORFJDICIvdmFyL2xpYi9hbHNhL2Fzb3VuZC5zdGF0ZSIKKyNlbmRpZgorCitpbnQgZGVidWdmbGFnID0gMDsKK2ludCBmb3JjZV9yZXN0b3JlID0gMTsKK2ludCBpZ25vcmVfbm9jYXJkcyA9IDA7CitjaGFyICpjb21tYW5kOworY2hhciAqc3RhdGVmaWxlID0gTlVMTDsKKworc3RhdGljIHZvaWQgaGVscCh2b2lkKQoreworCXByaW50ZigiVXNhZ2U6IGFsc2FjdGwgPG9wdGlvbnM+IGNvbW1hbmRcbiIpOworCXByaW50ZigiXG5BdmFpbGFibGUgZ2xvYmFsIG9wdGlvbnM6XG4iKTsKKwlwcmludGYoIiAgLWgsLS1oZWxwICAgICAgICB0aGlzIGhlbHBcbiIpOworCXByaW50ZigiICAtZCwtLWRlYnVnICAgICAgIGRlYnVnIG1vZGVcbiIpOworCXByaW50ZigiICAtdiwtLXZlcnNpb24gICAgIHByaW50IHZlcnNpb24gb2YgdGhpcyBwcm9ncmFtXG4iKTsKKwlwcmludGYoIlxuQXZhaWxhYmxlIHN0YXRlIG9wdGlvbnM6XG4iKTsKKwlwcmludGYoIiAgLWYsLS1maWxlICMgICAgICBjb25maWd1cmF0aW9uIGZpbGUgKGRlZmF1bHQgIiBTWVNfQVNPVU5EUkMgIilcbiIpOworCXByaW50ZigiICAtRiwtLWZvcmNlICAgICAgIHRyeSB0byByZXN0b3JlIHRoZSBtYXRjaGluZyBjb250cm9scyBhcyBtdWNoIGFzIHBvc3NpYmxlXG4iKTsKKwlwcmludGYoIiAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCBtb2RlKVxuIik7CisJcHJpbnRmKCIgIC1nLC0taWdub3JlICAgICAgaWdub3JlICdObyBzb3VuZGNhcmRzIGZvdW5kJyBlcnJvclxuIik7CisJcHJpbnRmKCIgIC1QLC0tcGVkYW50aWMgICAgZG8gbm90IHJlc3RvcmUgbWlzbWF0Y2hpbmcgY29udHJvbHMgKG9sZCBkZWZhdWx0KVxuIik7CisJcHJpbnRmKCIgIC1JLC0tbm8taW5pdC1mYWxsYmFja1xuIgorCSAgICAgICAiICAgICAgICAgICAgICAgICAgIGRvbid0IGluaXRpYWxpemUgZXZlbiBpZiByZXN0b3JlIGZhaWxzXG4iKTsKKwlwcmludGYoIiAgLXIsLS1ydW5zdGF0ZSAjICBzYXZlIHJlc3RvcmUgYW5kIGluaXQgc3RhdGUgdG8gdGhpcyBmaWxlIChvbmx5IGVycm9ycylcbiIpOworCXByaW50ZigiICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgc2V0dGluZ3MgaXMgJ25vIGZpbGUgc2V0J1xuIik7CisJcHJpbnRmKCIgIC1SLC0tcmVtb3ZlICAgICAgcmVtb3ZlIHJ1bnN0YXRlIGZpbGUgYXQgZmlyc3QsIG90aGVyd2lzZSBhcHBlbmQgZXJyb3JzXG4iKTsKKwlwcmludGYoIlxuQXZhaWxhYmxlIGluaXQgb3B0aW9uczpcbiIpOworCXByaW50ZigiICAtRSwtLWVudiAjPSMJICAgc2V0IGVudmlyb25tZW50IHZhcmlhYmxlIGZvciBpbml0IHBoYXNlIChOQU1FPVZBTFVFKVxuIik7CisJcHJpbnRmKCIgIC1pLC0taW5pdGZpbGUgIyAgbWFpbiBjb25maWd1YXRpb24gZmlsZSBmb3IgaW5pdCBwaGFzZSAoZGVmYXVsdCAiIERBVEFESVIgIi9pbml0LzAwbWFpbilcbiIpOworCXByaW50ZigiXG4iKTsKKwlwcmludGYoIlxuQXZhaWxhYmxlIGNvbW1hbmRzOlxuIik7CisJcHJpbnRmKCIgIHN0b3JlICAgPGNhcmQgIz4gc2F2ZSBjdXJyZW50IGRyaXZlciBzZXR1cCBmb3Igb25lIG9yIGVhY2ggc291bmRjYXJkc1xuIik7CisJcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgdG8gY29uZmlndXJhdGlvbiBmaWxlXG4iKTsKKwlwcmludGYoIiAgcmVzdG9yZSA8Y2FyZCAjPiBsb2FkIGN1cnJlbnQgZHJpdmVyIHNldHVwIGZvciBvbmUgb3IgZWFjaCBzb3VuZGNhcmRzXG4iKTsKKwlwcmludGYoIiAgICAgICAgICAgICAgICAgICBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZVxuIik7CisJcHJpbnRmKCIgIGluaXQJICA8Y2FyZCAjPiBpbml0aWFsaXplIGRyaXZlciB0byBhIGRlZmF1bHQgc3RhdGVcbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uW10gPQorCXsKKwkJeyJoZWxwIiwgMCwgTlVMTCwgJ2gnfSwKKwkJeyJmaWxlIiwgMSwgTlVMTCwgJ2YnfSwKKwkJeyJlbnYiLCAxLCBOVUxMLCAnRSd9LAorCQl7ImluaXRmaWxlIiwgMSwgTlVMTCwgJ2knfSwKKwkJeyJuby1pbml0LWZhbGxiYWNrIiwgMCwgTlVMTCwgJ0knfSwKKwkJeyJmb3JjZSIsIDAsIE5VTEwsICdGJ30sCisJCXsiaWdub3JlIiwgMCwgTlVMTCwgJ2cnfSwKKwkJeyJwZWRhbnRpYyIsIDAsIE5VTEwsICdQJ30sCisJCXsicnVuc3RhdGUiLCAwLCBOVUxMLCAncid9LAorCQl7InJlbW92ZSIsIDAsIE5VTEwsICdSJ30sCisJCXsiZGVidWciLCAwLCBOVUxMLCAnZCd9LAorCQl7InZlcnNpb24iLCAwLCBOVUxMLCAndid9LAorCQl7TlVMTCwgMCwgTlVMTCwgMH0sCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZGV2ZmlsZXNbXSA9IHsKKwkJIi9kZXYvc25kL2NvbnRyb2xDIiwKKwkJIi9kZXYvc25kL3BjbUMiLAorCQkiL2Rldi9zbmQvbWlkaUMiLAorCQkiL2Rldi9zbmQvaHdDIiwKKwkJTlVMTAorCX07CisJY2hhciAqY2ZnZmlsZSA9IFNZU19BU09VTkRSQzsKKwljaGFyICppbml0ZmlsZSA9IERBVEFESVIgIi9pbml0LzAwbWFpbiI7CisJY2hhciAqY2FyZG5hbWUsIG5jYXJkbmFtZVsxNl07CisJY29uc3QgY2hhciAqY29uc3QgKnRtcDsKKwlpbnQgcmVtb3Zlc3RhdGUgPSAwOworCWludCBpbml0X2ZhbGxiYWNrID0gMTsgLyogbmV3IGRlZmF1bHQgYmVoYXZpb3IgKi8KKwlpbnQgcmVzOworCisJY29tbWFuZCA9IGFyZ3ZbMF07CisJd2hpbGUgKDEpIHsKKwkJaW50IGM7CisKKwkJaWYgKChjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImhkdmY6RmdFOmk6SVByOlIiLCBsb25nX29wdGlvbiwgTlVMTCkpIDwgMCkKKwkJCWJyZWFrOworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnaCc6CisJCQloZWxwKCk7CisJCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCQljYXNlICdmJzoKKwkJCWNmZ2ZpbGUgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnRic6CisJCQlmb3JjZV9yZXN0b3JlID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdnJzoKKwkJCWlnbm9yZV9ub2NhcmRzID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdFJzoKKwkJCWlmIChwdXRlbnYob3B0YXJnKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiZW52aXJvbm1lbnQgc3RyaW5nICclcycgaXMgd3JvbmdcbiIsIG9wdGFyZyk7CisJCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdpJzoKKwkJCWluaXRmaWxlID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ0knOgorCQkJaW5pdF9mYWxsYmFjayA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlzdGF0ZWZpbGUgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnUic6CisJCQlyZW1vdmVzdGF0ZSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnUCc6CisJCQlmb3JjZV9yZXN0b3JlID0gMDsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCWRlYnVnZmxhZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCQlwcmludGYoImFsc2FjdGwgdmVyc2lvbiAiIFNORF9VVElMX1ZFUlNJT05fU1RSICJcbiIpOworCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJY2FzZSAnPyc6CQkvLyBlcnJvciBtc2cgYWxyZWFkeSBwcmludGVkCisJCQloZWxwKCk7CisJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CQkvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCisJCQlmcHJpbnRmKHN0ZGVyciwgCisJCQkiSW52YWxpZCBvcHRpb24gJyVjJyAoJWQpIG5vdCBoYW5kbGVkPz9cbiIsIGMsIGMpOworCQl9CisJfQorCWlmIChhcmdjIC0gb3B0aW5kIDw9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJhbHNhY3RsOiBTcGVjaWZ5IGNvbW1hbmQuLi5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwljYXJkbmFtZSA9IGFyZ2MgLSBvcHRpbmQgPiAxID8gYXJndltvcHRpbmQgKyAxXSA6IE5VTEw7CisJZm9yICh0bXAgPSBkZXZmaWxlczsgY2FyZG5hbWUgIT0gTlVMTCAmJiAqdG1wICE9IE5VTEw7IHRtcCsrKSB7CisJCWludCBsZW4gPSBzdHJsZW4oKnRtcCk7CisJCWlmICghc3RybmNtcChjYXJkbmFtZSwgKnRtcCwgbGVuKSkgeworCQkJbG9uZyBsID0gc3RydG9sKGNhcmRuYW1lICsgbGVuLCBOVUxMLCAwKTsKKwkJCXNwcmludGYobmNhcmRuYW1lLCAiJWxpIiwgbCk7CisJCQljYXJkbmFtZSA9IG5jYXJkbmFtZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFzdHJjbXAoYXJndltvcHRpbmRdLCAiaW5pdCIpKSB7CisJCXJlcyA9IGluaXQoaW5pdGZpbGUsIGNhcmRuYW1lKTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltvcHRpbmRdLCAic3RvcmUiKSkgeworCQlyZXMgPSBzYXZlX3N0YXRlKGNmZ2ZpbGUsIGNhcmRuYW1lKTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltvcHRpbmRdLCAicmVzdG9yZSIpKSB7CisJCWlmIChyZW1vdmVzdGF0ZSkKKwkJCXJlbW92ZShzdGF0ZWZpbGUpOworCQlyZXMgPSBsb2FkX3N0YXRlKGNmZ2ZpbGUsIGluaXRmaWxlLCBjYXJkbmFtZSwgaW5pdF9mYWxsYmFjayk7CisJfSBlbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsICJhbHNhY3RsOiBVbmtub3duIGNvbW1hbmQgJyVzJy4uLlxuIiwgCisJCQlhcmd2W29wdGluZF0pOworCQlyZXMgPSAtRU5PREVWOworCX0KKworCXNuZF9jb25maWdfdXBkYXRlX2ZyZWVfZ2xvYmFsKCk7CisJcmV0dXJuIHJlcyA8IDAgPyAtcmVzIDogMDsKK30KZGlmZiAtLWdpdCBhL2Fsc2FjdGwvYWxzYWN0bC5oIGIvYWxzYWN0bC9hbHNhY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU5MGVmYgotLS0gL2Rldi9udWxsCisrKyBiL2Fsc2FjdGwvYWxzYWN0bC5oCkBAIC0wLDAgKzEsOTQgQEAKK2V4dGVybiBpbnQgZGVidWdmbGFnOworZXh0ZXJuIGludCBmb3JjZV9yZXN0b3JlOworZXh0ZXJuIGludCBpZ25vcmVfbm9jYXJkczsKK2V4dGVybiBjaGFyICpjb21tYW5kOworZXh0ZXJuIGNoYXIgKnN0YXRlZmlsZTsKKworI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NSkKKyNkZWZpbmUgaW5mbyguLi4pIGRvIHtcCisJZnByaW50ZihzdGRvdXQsICIlczogJXM6JWQ6ICIsIGNvbW1hbmQsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOyBcCisJZnByaW50ZihzdGRvdXQsIF9fVkFfQVJHU19fKTsgXAorCXB1dGMoJ1xuJywgc3Rkb3V0KTsgXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIGluZm8oYXJncy4uLikgZG8ge1wKKwlmcHJpbnRmKHN0ZG91dCwgIiVzOiAlczolZDogIiwgY29tbWFuZCwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IFwKKwlmcHJpbnRmKHN0ZG91dCwgIyNhcmdzKTsgXAorCXB1dGMoJ1xuJywgc3Rkb3V0KTsgXAorfSB3aGlsZSAoMCkKKyNlbmRpZgkKKworI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NSkKKyNkZWZpbmUgZXJyb3IoLi4uKSBkbyB7XAorCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzOiVkOiAiLCBjb21tYW5kLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgXAorCWZwcmludGYoc3RkZXJyLCBfX1ZBX0FSR1NfXyk7IFwKKwlwdXRjKCdcbicsIHN0ZGVycik7IFwKK30gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBlcnJvcihhcmdzLi4uKSBkbyB7XAorCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzOiVkOiAiLCBjb21tYW5kLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgXAorCWZwcmludGYoc3RkZXJyLCAjI2FyZ3MpOyBcCisJcHV0YygnXG4nLCBzdGRlcnIpOyBcCit9IHdoaWxlICgwKQorI2VuZGlmCQorCisjaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDk1KQorI2RlZmluZSBjZXJyb3IoY29uZCwgLi4uKSBkbyB7XAorCWlmIChjb25kIHx8IGRlYnVnZmxhZykgeyBcCisJCWZwcmludGYoc3RkZXJyLCAiJXMlczogJXM6JWQ6ICIsIGRlYnVnZmxhZyA/ICJXQVJOSU5HOiAiIDogIiIsIGNvbW1hbmQsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOyBcCisJCWZwcmludGYoc3RkZXJyLCBfX1ZBX0FSR1NfXyk7IFwKKwkJcHV0YygnXG4nLCBzdGRlcnIpOyBcCisJfSBcCit9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgY2Vycm9yKGNvbmQsIGFyZ3MuLi4pIGRvIHtcCisJaWYgKGNvbmQgfHwgZGVidWdmbGFnKSB7IFwKKwkJZnByaW50ZihzdGRlcnIsICIlcyVzOiAlczolZDogIiwgZGVidWdmbGFnID8gIldBUk5JTkc6ICIgOiAiIiwgY29tbWFuZCwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IFwKKwkJZnByaW50ZihzdGRlcnIsICMjYXJncyk7IFwKKwkJcHV0YygnXG4nLCBzdGRlcnIpOyBcCisJfSBcCit9IHdoaWxlICgwKQorI2VuZGlmCQorCisjaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDk1KQorI2RlZmluZSBkYmcoLi4uKSBkbyB7XAorCWlmICghZGVidWdmbGFnKSBicmVhazsgXAorCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzOiVkOiAiLCBjb21tYW5kLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgXAorCWZwcmludGYoc3RkZXJyLCBfX1ZBX0FSR1NfXyk7IFwKKwlwdXRjKCdcbicsIHN0ZGVycik7IFwKK30gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBkYmcoYXJncy4uLikgZG8ge1wKKwlpZiAoIWRlYnVnZmxhZykgYnJlYWs7IFwKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiAlczolZDogIiwgY29tbWFuZCwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IFwKKwlmcHJpbnRmKHN0ZGVyciwgIyNhcmdzKTsgXAorCXB1dGMoJ1xuJywgc3RkZXJyKTsgXAorfSB3aGlsZSAoMCkKKyNlbmRpZgkKKworaW50IGluaXQoY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqY2FyZG5hbWUpOworaW50IHNhdmVfc3RhdGUoY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqY2FyZG5hbWUpOworaW50IGxvYWRfc3RhdGUoY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqaW5pdGZpbGUsIGNvbnN0IGNoYXIgKmNhcmRuYW1lLAorCSAgICAgICBpbnQgZG9faW5pdCk7CitpbnQgcG93ZXIoY29uc3QgY2hhciAqYXJndltdLCBpbnQgYXJnYyk7CitpbnQgZ2VuZXJhdGVfbmFtZXMoY29uc3QgY2hhciAqY2ZnZmlsZSk7CisKKy8qIHV0aWxzICovCisKK2ludCBmaWxlX21hcChjb25zdCBjaGFyICpmaWxlbmFtZSwgY2hhciAqKmJ1Ziwgc2l6ZV90ICpidWZzaXplKTsKK3ZvaWQgZmlsZV91bm1hcCh2b2lkICpidWYsIHNpemVfdCBidWZzaXplKTsKK3NpemVfdCBsaW5lX3dpZHRoKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUsIHNpemVfdCBwb3MpOwordm9pZCBpbml0ZmFpbGVkKGludCBjYXJkbnVtYmVyLCBjb25zdCBjaGFyICpyZWFzb24sIGludCBleGl0Y29kZSk7CisKK3N0YXRpYyBpbmxpbmUgaW50IGhleHRvZGlnaXQoaW50IGMpCit7CisgICAgICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKKyAgICAgICAgICAgICAgICBjIC09ICcwJzsKKyAgICAgICAgZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisgICAgICAgICAgICAgICAgYyA9IGMgLSAnYScgKyAxMDsKKyAgICAgICAgZWxzZSBpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpCisgICAgICAgICAgICAgICAgYyA9IGMgLSAnQScgKyAxMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIGM7Cit9CmRpZmYgLS1naXQgYS9hbHNhY3RsL2Fsc2FjdGxfaW5pdC54bWwgYi9hbHNhY3RsL2Fsc2FjdGxfaW5pdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVmZTllZgotLS0gL2Rldi9udWxsCisrKyBiL2Fsc2FjdGwvYWxzYWN0bF9pbml0LnhtbApAQCAtMCwwICsxLDYyNSBAQAorPD94bWwgdmVyc2lvbj0nMS4wJz8+Cis8IURPQ1RZUEUgYXJ0aWNsZSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMi8vRU4iCisgICJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuMi9kb2Nib29reC5kdGQiPgorCis8YXJ0aWNsZT4KKyAgPHNlY3Rpb24+CisgICAgPHRpdGxlPmFsc2FjdGwgaW5pdDwvdGl0bGU+CisgICAgPHJlZmVudHJ5PgorICAgICAgPHJlZmVudHJ5aW5mbz4KKyAgICAgICAgPHRpdGxlPmFsc2FjdGwgaW5pdDwvdGl0bGU+CisgICAgICAgIDxkYXRlPkp1bHkgMjAwODwvZGF0ZT4KKyAgICAgICAgPHByb2R1Y3RuYW1lPmFsc2FjdGw8L3Byb2R1Y3RuYW1lPgorICAgICAgPC9yZWZlbnRyeWluZm8+CisKKyAgICAgIDxyZWZtZXRhPgorICAgICAgICA8cmVmZW50cnl0aXRsZT5hbHNhY3RsX2luaXQ8L3JlZmVudHJ5dGl0bGU+CisgICAgICAgIDxtYW52b2xudW0+NzwvbWFudm9sbnVtPgorICAgICAgICA8cmVmbWlzY2luZm8gY2xhc3M9InZlcnNpb24iPjwvcmVmbWlzY2luZm8+CisgICAgICA8L3JlZm1ldGE+CisKKyAgICAgIDxyZWZuYW1lZGl2PgorICAgICAgICA8cmVmbmFtZT5hbHNhY3RsIGluaXQ8L3JlZm5hbWU+CisgICAgICAgIDxyZWZwdXJwb3NlPmFsc2EgY29udHJvbCBtYW5hZ2VtZW50IC0gaW5pdGlhbGl6YXRpb248L3JlZnB1cnBvc2U+CisgICAgICA8L3JlZm5hbWVkaXY+CisKKyAgICAgIDxyZWZzZWN0MT48dGl0bGU+REVTQ1JJUFRJT048L3RpdGxlPgorICAgICAgICA8cGFyYT4iYWxzYWN0bCBpbml0IiBwcm92aWRlcyBzb3VuZGNhcmQgc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24uPC9wYXJhPgorICAgICAgPC9yZWZzZWN0MT4KKworICAgICAgPHJlZnNlY3QxPjx0aXRsZT5DT05GSUdVUkFUSU9OPC90aXRsZT4KKyAgICAgICAgPHBhcmE+QWxsICJhbHNhY3RsIGluaXQiIGNvbmZpZ3VyYXRpb24gZmlsZXMgYXJlIHBsYWNlZCBpbgorICAgICAgICA8ZmlsZW5hbWU+L3Vzci9zaGFyZS9hbHNhL2luaXQvPC9maWxlbmFtZT4gZGlyZWN0b3J5LiBUaGUgdG9wIGxldmVsCisgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyA8ZmlsZW5hbWU+L3Vzci9zaGFyZS9hbHNhL2luaXQvMDBtYWluPC9maWxlbmFtZT4uCisJVGhlIGRlZmF1bHQgdG9wLWxldmVsIGZpbGUgY2FuIGJlIGFsc28gc3BlY2lmaWVkIHVzaW5nIC1pIG9yCisJLS1pbml0ZmlsZSBwYXJhbWV0ZXIgZm9yIHRoZSBhbHNhY3RsIHRvb2wuCisJRXZlcnkgZmlsZSBjb25zaXN0cyBvZiBhIHNldCBvZiBsaW5lcyBvZiB0ZXh0LiBBbGwgZW1wdHkgbGluZXMgb3IKKyAgICAgICAgbGluZXMgYmVnaW5uaW5nIHdpdGggJyMnIHdpbGwgYmUgaWdub3JlZC48L3BhcmE+CisKKyAgICAgICAgPHJlZnNlY3QyPjx0aXRsZT5SdWxlcyBmaWxlczwvdGl0bGU+CisgICAgICAgICAgPHBhcmE+VGhlICJhbHNhY3RsIGluaXQiIHJ1bGVzIGFyZSByZWFkIGZyb20gdGhlIGZpbGVzIGxvY2F0ZWQKKyAgICAgICAgICBpbiB0aGUgPGZpbGVuYW1lPi91c3Ivc2hhcmUvYWxzYS9pbml0Lyo8L2ZpbGVuYW1lPi4gVGhlIHRvcAorICAgICAgICAgIGxldmVsIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyA8ZmlsZW5hbWU+L3Vzci9zaGFyZS9hbHNhL2luaXQvMDBtYWluPC9maWxlbmFtZT4uCisgICAgICAgICAgRXZlcnkgbGluZSBpbiB0aGUgcnVsZXMgZmlsZSBjb250YWlucyBhdCBsZWFzdCBvbmUga2V5IHZhbHVlIHBhaXIuCisgICAgICAgICAgVGhlcmUgYXJlIHR3byBraW5kIG9mIGtleXMsIG1hdGNoIGFuZCBhc3NpZ25tZW50IGtleXMuIElmIGFsbCBtYXRjaAorICAgICAgICAgIGtleXMgYXJlIG1hdGNoaW5nIGFnYWluc3QgaXRzIHZhbHVlLCB0aGUgcnVsZSBnZXRzIGFwcGxpZWQgYW5kIHRoZQorICAgICAgICAgIGFzc2lnbiBrZXlzIGdldCB0aGUgc3BlY2lmaWVkIHZhbHVlIGFzc2lnbmVkLjwvcGFyYT4KKyAgICAgICAgICAKKyAgICAgICAgICA8cGFyYT5BIHJ1bGUgbWF5IGNvbnNpc3RzIG9mIGEgbGlzdCBvZiBvbmUgb3IgbW9yZSBrZXkgdmFsdWUgcGFpcnMKKyAgICAgICAgICBzZXBhcmF0ZWQgYnkgYSBjb21tYS4gRWFjaCBrZXkgaGFzIGEgZGlzdGluY3Qgb3BlcmF0aW9uLCBkZXBlbmRpbmcKKyAgICAgICAgICBvbiB0aGUgdXNlZCBvcGVyYXRvci4gVmFsaWQgb3BlcmF0b3JzIGFyZTo8L3BhcmE+CisgICAgICAgICAgPHZhcmlhYmxlbGlzdD4KKyAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgIDx0ZXJtPjxvcHRpb24+PT08L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT5Db21wYXJlIGZvciBlcXVhbGl0eS48L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj4hPTwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPkNvbXBhcmUgZm9yIG5vbi1lcXVhbGl0eS48L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj49PC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+QXNzaWduIGEgdmFsdWUgdG8gYSBrZXkuIEtleXMgdGhhdCByZXByZXNlbnQgYSBsaXN0LAorICAgICAgICAgICAgICAgIGFyZSByZXNldCBhbmQgb25seSB0aGlzIHNpbmdsZSB2YWx1ZSBpcyBhc3NpZ25lZC48L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj4rPTwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPkFkZCB0aGUgdmFsdWUgdG8gYSBrZXkgdGhhdCBob2xkcyBhIGxpc3QKKyAgICAgICAgICAgICAgICBvZiBlbnRyaWVzLjwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICA8dGVybT48b3B0aW9uPjo9PC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+QXNzaWduICBhICB2YWx1ZSAgdG8gIGEga2V5IGZpbmFsbHk7IGRpc2FsbG93IGFueQorICAgICAgICAgICAgICAgIGxhdGVyIGNoYW5nZXMsIHdoaWNoIG1heSBiZSB1c2VkIHRvIHByZXZlbnQgY2hhbmdlcyBieQorICAgICAgICAgICAgICAgIGFueSBsYXRlciBydWxlcy48L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICAgICAgICA8L3ZhcmlhYmxlbGlzdD4KKworICAgICAgICAgIDxwYXJhPlRoZSBmb2xsb3dpbmcga2V5IG5hbWVzIGNhbiBiZSB1c2VkIHRvIG1hdGNoIGFnYWluc3QgZGV2aWNlCisgICAgICAgICAgcHJvcGVydGllczo8L3BhcmE+CisgICAgICAgICAgPHZhcmlhYmxlbGlzdD4KKyAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgIDx0ZXJtPjxvcHRpb24+Q0FSRElOREVYPC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+TWF0Y2ggdGhlIGNhcmQgaW5kZXggb2YgdGhlIEFMU0EgZHJpdmVyLjwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICA8dGVybT48b3B0aW9uPkNUTHs8cmVwbGFjZWFibGU+YXR0cmlidXRlPC9yZXBsYWNlYWJsZT59PC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+U2V0IG9yIHRlc3QgdW5pdmVyc2FsIGNvbnRyb2wgYXR0cmlidXRlLiBQb3NzaWJsZQorCQlhdHRyaWJ1dGVzOjwvcGFyYT4KKyAgICAgICAgICAgICAgICA8dmFyaWFibGVsaXN0PgorICAgICAgICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj5udW1pZDwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPk51bWVyaWMgY29udHJvbCBpZGVudGlmaWNhdGlvbi48L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDx0ZXJtPjxvcHRpb24+aWZhY2U8L29wdGlvbj4sIDxvcHRpb24+aW50ZXJmYWNlPC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Q29udHJvbCBpbnRlcmZhY2UgbmFtZSAoQ0FSRCwgSFdFREVQLCBNSVhFUiwgUENNLCBSQVdNSURJLCBUSU1FUiwgU0VRVUVOQ0VSKTwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj5zdWJkZXY8L29wdGlvbj4sIDxvcHRpb24+c3ViZGV2aWNlPC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+U3ViZGV2aWNlIG51bWJlci48L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDx0ZXJtPjxvcHRpb24+bmFtZTwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPkNvbnRyb2wgbmFtZTwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj5pbmRleDwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPkNvbnRyb2wgaW5kZXg8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDx0ZXJtPjxvcHRpb24+dHlwZTwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPkNvbnRyb2wgdHlwZSAoQk9PTEVBTiwgSU5URUdFUiwgSU5URUdFUjY0LCBFTlVNRVJBVEVELCBCWVRFUywgSUVDOTU4KTwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj5hdHRyPC9vcHRpb24+LCA8b3B0aW9uPmF0dHJpYnV0ZTwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPkF0dHJpYnV0ZXMgKHN0b3JlZCBpbiBhIHN0cmluZyAtIHVzZSBtYXRjaCBjaGFyYWN0ZXJzICogYW5kID8pOjwvcGFyYT4KKwkgICAgICAgICAgICAgIDx2YXJpYWJsZWxpc3Q+CisJICAgICAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisJICAgICAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj5yPC9vcHRpb24+PC90ZXJtPgorCSAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKwkgICAgICAgICAgICAgICAgICAgIDxwYXJhPmNvbnRyb2wgaXMgcmVhZGFibGU8L3BhcmE+CisJICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKwkgICAgICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisJICAgICAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisJICAgICAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj53PC9vcHRpb24+PC90ZXJtPgorCSAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKwkgICAgICAgICAgICAgICAgICAgIDxwYXJhPmNvbnRyb2wgaXMgd3JpdGFibGU8L3BhcmE+CisJICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKwkgICAgICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisJICAgICAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisJICAgICAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj52PC9vcHRpb24+PC90ZXJtPgorCSAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKwkgICAgICAgICAgICAgICAgICAgIDxwYXJhPmNvbnRyb2wgaXMgdm9sYXRpbGU8L3BhcmE+CisJICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKwkgICAgICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisJICAgICAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisJICAgICAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj5pPC9vcHRpb24+PC90ZXJtPgorCSAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKwkgICAgICAgICAgICAgICAgICAgIDxwYXJhPmNvbnRyb2wgaXMgaW5hY3RpdmU8L3BhcmE+CisJICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKwkgICAgICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisJICAgICAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisJICAgICAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj5sPC9vcHRpb24+PC90ZXJtPgorCSAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKwkgICAgICAgICAgICAgICAgICAgIDxwYXJhPmNvbnRyb2wgaXMgbG9ja2VkPC9wYXJhPgorCSAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisJICAgICAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCSAgICAgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorCSAgICAgICAgICAgICAgICAgIDx0ZXJtPjxvcHRpb24+Ujwvb3B0aW9uPjwvdGVybT4KKwkgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisJICAgICAgICAgICAgICAgICAgICA8cGFyYT5jb250cm9sIGlzIFRMViByZWFkYWJsZTwvcGFyYT4KKwkgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCSAgICAgICAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKwkgICAgICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKwkgICAgICAgICAgICAgICAgICA8dGVybT48b3B0aW9uPlc8L29wdGlvbj48L3Rlcm0+CisJICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorCSAgICAgICAgICAgICAgICAgICAgPHBhcmE+Y29udHJvbCBpcyBUTFYgd3JpdGFibGU8L3BhcmE+CisJICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKwkgICAgICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisJICAgICAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisJICAgICAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj5DPC9vcHRpb24+PC90ZXJtPgorCSAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKwkgICAgICAgICAgICAgICAgICAgIDxwYXJhPmNvbnRyb2wgaXMgVExWIGNvbW1hbmRhYmxlPC9wYXJhPgorCSAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisJICAgICAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCSAgICAgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorCSAgICAgICAgICAgICAgICAgIDx0ZXJtPjxvcHRpb24+bzwvb3B0aW9uPjwvdGVybT4KKwkgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisJICAgICAgICAgICAgICAgICAgICA8cGFyYT5wcm9jZXNzIGlzIG93bmVyIG9mIHRoaXMgY29udHJvbDwvcGFyYT4KKwkgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCSAgICAgICAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKwkgICAgICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKwkgICAgICAgICAgICAgICAgICA8dGVybT48b3B0aW9uPnU8L29wdGlvbj48L3Rlcm0+CisJICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorCSAgICAgICAgICAgICAgICAgICAgPHBhcmE+Y29udHJvbCBjcmVhdGVkIGluIHVzZXIgc3BhY2U8L3BhcmE+CisJICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKwkgICAgICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisJICAgICAgICAgICAgICA8L3ZhcmlhYmxlbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj5vd25lcjwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPkNvbnRyb2wgb3duZXIgcHJvY2VzcyBQSUQgbnVtYmVyPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgICAgICA8dGVybT48b3B0aW9uPmNvdW50PC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+Q29udHJvbCBjb3VudCBvZiB2YWx1ZXM8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDx0ZXJtPjxvcHRpb24+bWluPC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+VmFsdWUgcmFuZ2UgLSBtaW5pbXVtIHZhbHVlPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgICAgICA8dGVybT48b3B0aW9uPm1heDwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPlZhbHVlIHJhbmdlIC0gbWF4aW11bSB2YWx1ZTwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj5zdGVwPC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+VmFsdWUgcmFuZ2UgLSBzdGVwIHZhbHVlPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgICAgICA8dGVybT48b3B0aW9uPmRCbWluPC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+VmFsdWUgcmFuZ2UgLSBtaW5pbXVtIGRCIHZhbHVlPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgICAgICA8dGVybT48b3B0aW9uPmRCbWF4PC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+VmFsdWUgcmFuZ2UgLSBtYXhpbXVtIGRCIHZhbHVlPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgICAgICA8dGVybT48b3B0aW9uPml0ZW1zPC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+RW51bWVyYXRlZCB2YWx1ZSAtIG51bWJlciBvZiB0ZXh0IGl0ZW1zPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgICAgICA8dGVybT48b3B0aW9uPmVudW1zPC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+RW51bWVyYXRlZCB2YWx1ZSAtIGxpc3Qgb2YgdGV4dCBuYW1lcyBzdG9yZWQgYmV0d2VlbiAnfCcgY2hhcmFjdGVyPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgICAgICA8dGVybT48b3B0aW9uPnZhbHVlPC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+VmFsdWUgb2YgY29udHJvbCBzdG9yZWQgdG8gYSBzdHJpbmcgZGVsaW1pdGVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgY29tbWEgKCwpLjwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj5kb19zZWFyY2g8L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5TZWFyY2ggZm9yIGEgY29udHJvbC4gVmFsdWUgIjEiIGlzIHJldHVybmVkCisgICAgICAgICAgICAgICAgICAgICAgaWYgYSBjb250cm9sIHdhcyBmb3VuZC4gVGhlIENUTHtuYW1lfSBrZXkgbWlnaHQKKwkJICAgICAgY29udGFpbiBtYXRjaCBjaGFyYWN0ZXJzICogYW5kID8uIEFuIGNvbnRyb2wgaW5kZXgKKwkJICAgICAgbWlnaHQgYmUgc3BlY2lmaWVkIGFzIGZpcnN0IGFyZ3VtZW50IHN0YXJ0aW5nIGZyb20KKwkJICAgICAgemVybyAoZS5nLiBDVEx7ZG9fc2VhcmNoIDJ9PSIxIikuPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj5kb19jb3VudDwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPlNlYXJjaCBmb3IgYSBjb250cm9scyBhbmQgcmV0dXJuIHRvdGFsIGNvdW50CisgICAgICAgICAgICAgICAgICAgICAgb2YgbWF0Y2hlZCBvbmVzLiBUaGUgQ1RMe25hbWV9IGtleSBtaWdodCBjb250YWluIG1hdGNoCisgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycyAqIGFuZCA/LjwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgICA8L3ZhcmlhYmxlbGlzdD4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICA8dGVybT48b3B0aW9uPkNPTkZJR3tzeXNmc19kZXZpY2V9PC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+VGhlIHJlbGF0aXZlIHBhdGggdG8gc3lzZnMgc3Vic3lzdGVtIHNwZWNpZnlpbmcKKyAgICAgICAgICAgICAgICB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgYSBzb3VuZGNhcmQgZGV2aWNlLiBVc3VhbGx5LAorICAgICAgICAgICAgICAgIGl0IHNob3VsZCBiZSBzZXQgdG8gIi9jbGFzcy9zb3VuZC9jYXJkJGNhcmRpbmZve2NhcmR9L2RldmljZSIuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgIDx0ZXJtPjxvcHRpb24+QVRUUns8cmVwbGFjZWFibGU+ZmlsZW5hbWU8L3JlcGxhY2VhYmxlPn08L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT5NYXRjaCBzeXNmcyBhdHRyaWJ1dGUgdmFsdWVzIG9mIHRoZSBzb3VuZGNhcmQgZGV2aWNlLgorICAgICAgICAgICAgICAgIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHN5c2ZzIHRyZWUgbXVzdCBiZSBkZWZpbmVkIGJ5CisJCUNPTkZJR3tzeXNmc19kZXZpY2V9IGtleS4gVHJhaWxpbmcgd2hpdGVzcGFjZSBpbiB0aGUgYXR0cmlidXRlCisJCXZhbHVlcyBpcyBpZ25vcmVkLCBpZiB0aGUgc3BlY2lmaWVkIG1hdGNoIHZhbHVlIGRvZXMKKwkJbm90IGNvbnRhaW4gdHJhaWxpbmcgd2hpdGVzcGFjZSBpdHNlbGYuIERlcGVuZGluZyBvbgorCQl0aGUgdHlwZSBvZiBvcGVyYXRvciwgdGhpcyBrZXkgaXMgYWxzbyB1c2VkIHRvIHNldAorCQl0aGUgdmFsdWUgb2YgYSBzeXNmcyBhdHRyaWJ1dGUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgIDx0ZXJtPjxvcHRpb24+RU5WezxyZXBsYWNlYWJsZT5rZXk8L3JlcGxhY2VhYmxlPn08L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT5NYXRjaCBhZ2FpbnN0IHRoZSB2YWx1ZSBvZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gVXAKKyAgICAgICAgICAgICAgICB0byBmaXZlIDxvcHRpb24+RU5WPC9vcHRpb24+IGtleXMgY2FuIGJlIHNwZWNpZmllZCBwZXIgcnVsZS4KKyAgICAgICAgICAgICAgICBEZXBlbmRpbmcgb24gdGhlIHR5cGUgb2Ygb3BlcmF0b3IsIHRoaXMga2V5IGlzIGFsc28gdXNlZAorICAgICAgICAgICAgICAgIHRvIGV4cG9ydCBhIHZhcmlhYmxlIHRvIHRoZSBlbnZpcm9ubWVudC48L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj5QUk9HUkFNPC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+RXhlY3V0ZSBleHRlcm5hbCBwcm9ncmFtLiBUaGUga2V5IGlzIHRydWUsIGlmCisgICAgICAgICAgICAgICAgdGhlIHByb2dyYW0gcmV0dXJucyB3aXRob3V0IGV4aXQgY29kZSB6ZXJvLiBUaGUgd2hvbGUgZXZlbnQKKyAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCBpcyBhdmFpbGFibGUgdG8gdGhlIGV4ZWN1dGVkIHByb2dyYW0uIFRoZQorICAgICAgICAgICAgICAgIHByb2dyYW0ncyBvdXRwdXQgcHJpbnRlZCB0byBzdGRvdXQgaXMgYXZhaWxhYmxlIGZvcgorICAgICAgICAgICAgICAgIHRoZSBSRVNVTFQga2V5LjwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT5TZXZlcmFsIGJ1aWxkaW4gY29tbWFuZHMgYXJlIGF2YWlsYWJsZTo8L3BhcmE+CisgICAgICAgICAgICAgICAgPHZhcmlhYmxlbGlzdD4KKyAgICAgICAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDx0ZXJtPjxvcHRpb24+X19jdGxfc2VhcmNoPC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+U2VhcmNoIGZvciBhIGNvbnRyb2wuIFRoZSBDVEx7bmFtZX0ga2V5IG1pZ2h0CisJCSAgICAgIGNvbnRhaW4gbWF0Y2ggY2hhcmFjdGVycyAqIGFuZCA/LiBBbiBjb250cm9sIGluZGV4CisJCSAgICAgIG1pZ2h0IGJlIHNwZWNpZmllZCBhcyBmaXJzdCBhcmd1bWVudCBzdGFydGluZyBmcm9tCisJCSAgICAgIHplcm8gKGUuZy4gUFJPR1JBTT0iX19jdGxfc2VhcmNoIDIiKS48L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgICAgICA8dGVybT48b3B0aW9uPl9fY3RsX2NvdW50PC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+U2VhcmNoIGZvciBhIGNvbnRyb2xzIGFuZCByZXR1cm4gdG90YWwgY291bnQKKyAgICAgICAgICAgICAgICAgICAgICBvZiBtYXRjaGVkIG9uZXMuIFRoZSBDVEx7bmFtZX0ga2V5IG1pZ2h0IGNvbnRhaW4gbWF0Y2gKKyAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzICogYW5kID8uPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCQk8L3ZhcmlhYmxlbGlzdD4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICA8dGVybT48b3B0aW9uPlJFU1VMVDwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPk1hdGNoIHRoZSByZXR1cm5lZCBzdHJpbmcgb2YgdGhlIGxhc3QgUFJPR1JBTSBjYWxsLgorICAgICAgICAgICAgICAgIFRoaXMga2V5IGNhbiBiZSB1c2VkIGluIHRoZSBzYW1lIG9yIGluIGFueSBsYXRlciBydWxlCisgICAgICAgICAgICAgICAgYWZ0ZXIgYSBQUk9HUkFNIGNhbGwuPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgICAgICA8L3ZhcmlhYmxlbGlzdD4KKworICAgICAgICAgIDxwYXJhPk1vc3Qgb2YgdGhlIGZpZWxkcyBzdXBwb3J0IGEgc2hlbGwgc3R5bGUgcGF0dGVybiBtYXRjaGluZy4KKyAgICAgICAgICBUaGUgZm9sbG93aW5nIHBhdHRlcm4gY2hhcmFjdGVycyBhcmUgc3VwcG9ydGVkOjwvcGFyYT4KKyAgICAgICAgICA8dmFyaWFibGVsaXN0PgorICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj4qPC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+TWF0Y2hlcyB6ZXJvLCBvciBhbnkgbnVtYmVyIG9mIGNoYXJhY3RlcnMuPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICA8dGVybT48b3B0aW9uPj88L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT5NYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyLjwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj5bXTwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPk1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIgc3BlY2lmaWVkIHdpdGhpbgorICAgICAgICAgICAgICAgIHRoZSBicmFja2V0cy4gRm9yIGV4YW1wbGUsIHRoZSBwYXR0ZXJuIHN0cmluZyAndHR5W1NSXScKKyAgICAgICAgICAgICAgICB3b3VsZCBtYXRjaCBlaXRoZXIgJ3R0eVMnIG9yICd0dHlSJy4gUmFuZ2VzIGFyZSBhbHNvCisgICAgICAgICAgICAgICAgc3VwcG9ydGVkIHdpdGhpbiB0aGlzIG1hdGNoIHdpdGggdGhlICctJyBjaGFyYWN0ZXIuCisgICAgICAJCUZvciBleGFtcGxlLCB0byBtYXRjaCBvbiB0aGUgcmFuZ2Ugb2YgYWxsIGRpZ2l0cywKKyAgICAgIAkJdGhlIHBhdHRlcm4gWzAtOV0gd291bGQgYmUgdXNlZC4gSWYgdGhlIGZpcnN0IGNoYXJhY3RlcgorICAgICAgCQlmb2xsb3dpbmcgdGhlICdbJyBpcyBhICchJywgYW55IGNoYXJhY3RlcnMKKyAgICAgICAgICAgICAgICBub3QgZW5jbG9zZWQgYXJlIG1hdGNoZWQuPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgICAgPC92YXJpYWJsZWxpc3Q+CisKKyAgICAgICAgICA8cGFyYT5UaGUgZm9sbG93aW5nIGtleXMgY2FuIGdldCB2YWx1ZXMgYXNzaWduZWQ6PC9wYXJhPgorICAgICAgICAgIDx2YXJpYWJsZWxpc3Q+CisgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICA8dGVybT48b3B0aW9uPkNUTHtudW1pZH08L29wdGlvbj4sIDxvcHRpb24+Q1RMe2lmYWNlfTwvb3B0aW9uPiwKKwkJICAgIDxvcHRpb24+Q1RMe2RldmljZX08L29wdGlvbj4sIDxvcHRpb24+Q1RMe3N1YmRldn08L29wdGlvbj4sIAorCQkgICAgPG9wdGlvbj5DVEx7bmFtZX08L29wdGlvbj4sICA8b3B0aW9uPkNUTHtpbmRleH08L29wdGlvbj4sIAorCSAgICAgIDwvdGVybT4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAJIDxwYXJhPlNlbGVjdCB1bml2ZXJzYWwgY29udHJvbCBlbGVtZW50LjwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj5DVEx7dmFsdWV9PC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIAkgPHBhcmE+VmFsdWUgaXMgc2V0ICh3cml0dGVuKSBhbHNvIHRvIHNvdW5kY2FyZCdzIGNvbnRyb2wKKyAgICAgICAgICAgICAgCSBkZXZpY2UgYW5kIFJFU1VMVCBrZXkgaXMgc2V0IHRvIGVycm5vIGNvZGUuIFRoZSByZXN1bHQgb2YKKyAgICAgICAgICAgICAgICAgc2V0IG9wZXJhdGlvbiBpcyBhbHdheXMgdHJ1ZSAoaXQgbWVhbnMgY29udGludWUgd2l0aAorICAgICAgICAgICAgICAgICBuZXh0IGtleSBvbiBsaW5lKS48L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgIDx0ZXJtPjxvcHRpb24+Q1RMe3ZhbHVlc308L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgCSA8cGFyYT5WYWx1ZSBpcyBzZXQgKHdyaXR0ZW4pIGFsc28gdG8gc291bmRjYXJkJ3MgY29udHJvbAorICAgICAgICAgICAgICAJIGRldmljZSAoYWxsIGNvbnRyb2wgdmFsdWVzIGFyZSBzZXQgdG8gc3BlY2lmaWVkIHZhbHVlKSBhbmQKKyAgICAgICAgICAgICAgCSBSRVNVTFQga2V5IGlzIHNldCB0byBlcnJubyBjb2RlLiBUaGUgcmVzdWx0IG9mCisgICAgICAgICAgICAgICAgIHNldCBvcGVyYXRpb24gaXMgYWx3YXlzIHRydWUgKGl0IG1lYW5zIGNvbnRpbnVlIHdpdGgKKyAgICAgICAgICAgICAgICAgbmV4dCBrZXkgb24gbGluZSkuPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICA8dGVybT48b3B0aW9uPkNUTHt3cml0ZX08L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgCSA8cGFyYT5WYWx1ZSBpcyBzZXQgKHdyaXR0ZW4pIGFsc28gdG8gc291bmRjYXJkJ3MgY29udHJvbAorICAgICAgICAgICAgICAJIGRldmljZSAoYWxsIGNvbnRyb2wgdmFsdWVzIGFyZSBzZXQgdG8gc3BlY2lmaWVkIHZhbHVlKS4KKyAgICAgICAgICAgICAgCSBUaGUgcmVzdWx0IG9mIHNldCBvcGVyYXRpb24gaXMgdHJ1ZSB3aGVuIG9wZXJhdGlvbgorICAgICAgICAgICAgICAJIHN1Y2NlZWQgKGl0IG1lYW5zIGNvbnRpbnVlIHdpdGggbmV4dCBrZXkgb24gbGluZSkuPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgIDx0ZXJtPjxvcHRpb24+RU5WezxyZXBsYWNlYWJsZT5rZXk8L3JlcGxhY2VhYmxlPn08L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT5FeHBvcnQgYSB2YXJpYWJsZSB0byB0aGUgZW52aXJvbm1lbnQuIERlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBvcGVyYXRvciwKKyAgICAgICAgICAgICAgICB0aGlzIGtleSBpcyBhbHNvIHRvIG1hdGNoIGFnYWluc3QgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgIDx0ZXJtPjxvcHRpb24+UkVTVUxUPC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+U2V0IFJFU1VMVCB2YXJpYWJsZS4gTm90ZSB0aGF0IFBST0dSQU0gYWxzbyBzZXRzCisgICAgICAgICAgICAgICAgdGhpcyB2YXJpYWJsZSwgYnV0IHNldHRpbmcgdGhpcyB2YXJpYWJsZSBtYW51YWxseQorICAgICAgICAgICAgICAgIG1pZ2h0IGJlIHVzZWZ1bCB0byBjaGFuZ2UgY29kZSBleGVjdXRpb24gb3JkZXIgKGluY2x1ZGVkCisgICAgICAgICAgICAgICAgZmlsZXMpLjwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICA8dGVybT48b3B0aW9uPkxBQkVMPC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+TmFtZWQgbGFiZWwgd2hlcmUgYSBHT1RPIGNhbiBqdW1wIHRvLjwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICA8dGVybT48b3B0aW9uPkdPVE88L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT5KdW1wcyB0byB0aGUgbmV4dCBMQUJFTCB3aXRoIGEgbWF0Y2hpbmcgbmFtZS4KKyAgICAgICAgICAgICAgICAgICAgICBUaGUgZ290byBjYW5ub3QganVtcCBiYWNrd2FyZC48L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj5JTkNMVURFPC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+SW5jbHVkZSBzcGVjaWZpZWQgZmlsZW5hbWUgb3IgYWxsIGZpbGVzIGluIHNwZWNpZmllZCBkaXJlY3Rvcnk8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj5BQ0NFU1M8L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT5DaGVjayBpZiBzcGVjaWZpZWQgZmlsZSBvciBkaXJlY3RvcnkgZXhpc3RzPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgIDx0ZXJtPjxvcHRpb24+Q09ORklHe3N5c2ZzX2RldmljZX08L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT5UaGUgcmVsYXRpdmUgcGF0aCB0byBzeXNmcyBzdWJzeXN0ZW0gc3BlY2lmeWluZworICAgICAgICAgICAgICAgIHRoZSByb290IGRpcmVjdG9yeSBvZiBhIHNvdW5kY2FyZCBkZXZpY2UuIFVzdWFsbHksCisgICAgICAgICAgICAgICAgaXQgc2hvdWxkIGJlIHNldCB0byAiL2NsYXNzL3NvdW5kL2NhcmQkY2FyZGluZm97Y2FyZH0vZGV2aWNlIi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj5QUklOVDwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPlBSSU5UIHZhbHVlIHRvIHN0ZG91dC48L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj5FUlJPUjwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPlBSSU5UIHZhbHVlIHRvIHN0ZGVyci48L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj5FWElUPC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+RXhpdCBpbW1lZGlhdGVseSBhbmQgc2V0IHByb2dyYW0gZXhpdCBjb2RlIHRvIHZhbHVlCisgICAgICAgICAgICAgICAgKHNob3VsZCBiZSBpbnRlZ2VyKS4gSWYgdmFsdWUgaXMgInJldHVybiIgc3RyaW5nLAorICAgICAgICAgICAgICAgIHBhcnNlciBsZWF2ZXMgY3VycmVudCBpbmNsdWRlZCBmaWxlIGFuZCByZXR1cm5zIHRvIHBhcmVudAorICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZS48L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgICAgIDwvdmFyaWFibGVsaXN0PgorCisgICAgICAgICAgPHBhcmE+VGhlIDxvcHRpb24+UFJPR1JBTTwvb3B0aW9uPiwgPG9wdGlvbj5SRVNVTFQ8L29wdGlvbj4sCisgICAgICAgICAgPG9wdGlvbj5DVEx7dmFsdWV9PC9vcHRpb24+LAorCSAgPG9wdGlvbj5QUklOVDwvb3B0aW9uPiwgPG9wdGlvbj5FUlJPUjwvb3B0aW9uPiwKKwkgIDxvcHRpb24+RVhJVDwvb3B0aW9uPiwgPG9wdGlvbj5DT05GSUd7fTwvb3B0aW9uPgorCSAgZmllbGRzIHN1cHBvcnQgc2ltcGxlIHByaW50Zi1saWtlIHN0cmluZyBzdWJzdGl0dXRpb25zLgorICAgICAgICAgIEl0IGFsbG93cyB0aGUgdXNlIG9mIHRoZSBjb21wbGV0ZSBlbnZpcm9ubWVudCBzZXQgYnkgZWFybGllciBtYXRjaGluZworICAgICAgICAgIHJ1bGVzLiBGb3IgYWxsIG90aGVyIGZpZWxkcywgc3Vic3RpdHV0aW9ucyBhcmUgYXBwbGllZCB3aGlsZSB0aGUgaW5kaXZpZHVhbCBydWxlIGlzCisgICAgICAgICAgYmVpbmcgcHJvY2Vzc2VkLiBUaGUgYXZhaWxhYmxlIHN1YnN0aXR1dGlvbnMgYXJlOjwvcGFyYT4KKyAgICAgICAgICA8dmFyaWFibGVsaXN0PgorICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKwkgICAgICA8dGVybT48b3B0aW9uPiRjYXJkaW5mb3s8cmVwbGFjZWFibGU+YXR0cmlidXRlPC9yZXBsYWNlYWJsZT59PC9vcHRpb24+LCA8b3B0aW9uPiVpezxyZXBsYWNlYWJsZT5hdHRyaWJ1dGU8L3JlcGxhY2VhYmxlPn08L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT5TZWUgQ0FSRElORk97fSBmb3IgbW9yZSBkZXRhaWxzLjwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICA8dGVybT48b3B0aW9uPiRjdGx7PHJlcGxhY2VhYmxlPmF0dHJpYnV0ZTwvcmVwbGFjZWFibGU+fTwvb3B0aW9uPiwgPG9wdGlvbj4lQ3s8cmVwbGFjZWFibGU+YXR0cmlidXRlPC9yZXBsYWNlYWJsZT59PC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+U2VlIENUTHt9IGZvciBtb3JlIGRldGFpbHMuPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgIDx0ZXJtPjxvcHRpb24+JGF0dHJ7PHJlcGxhY2VhYmxlPmZpbGU8L3JlcGxhY2VhYmxlPn08L29wdGlvbj4sIDxvcHRpb24+JXN7PHJlcGxhY2VhYmxlPmZpbGU8L3JlcGxhY2VhYmxlPn08L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT5UaGUgdmFsdWUgb2YgYSBzeXNmcyBhdHRyaWJ1dGUgZm91bmQgYXQgdGhlIGRldmljZSwgd2hlcmUKKyAgICAgICAgICAgICAgICBhbGwga2V5cyBvZiB0aGUgcnVsZSBoYXZlIG1hdGNoZWQuCisgICAgICAgICAgICAgICAgSWYgdGhlIGF0dHJpYnV0ZSBpcyBhIHN5bWxpbmssIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHN5bWxpbmsgdGFyZ2V0IGlzCisgICAgICAgICAgICAgICAgcmV0dXJuZWQgYXMgdGhlIHZhbHVlLjwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICA8dGVybT48b3B0aW9uPiRlbnZ7PHJlcGxhY2VhYmxlPmtleTwvcmVwbGFjZWFibGU+fTwvb3B0aW9uPiwgPG9wdGlvbj4lRXs8cmVwbGFjZWFibGU+a2V5PC9yZXBsYWNlYWJsZT59PC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+VGhlIHZhbHVlIG9mIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLjwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICA8dGVybT48b3B0aW9uPiRyZXN1bHQ8L29wdGlvbj4sIDxvcHRpb24+JWM8L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT5UaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRoZSBleHRlcm5hbCBwcm9ncmFtIHJlcXVlc3RlZCB3aXRoIFBST0dSQU0uCisgICAgICAgICAgICAgICAgQSBzaW5nbGUgcGFydCBvZiB0aGUgc3RyaW5nLCBzZXBhcmF0ZWQgYnkgYSBzcGFjZSBjaGFyYWN0ZXIgbWF5IGJlIHNlbGVjdGVkCisgICAgICAgICAgICAgICAgYnkgc3BlY2lmeWluZyB0aGUgcGFydCBudW1iZXIgYXMgYW4gYXR0cmlidXRlOiA8b3B0aW9uPiVje059PC9vcHRpb24+LgorICAgICAgICAgICAgICAgIElmIHRoZSBudW1iZXIgaXMgZm9sbG93ZWQgYnkgdGhlICcrJyBjaGFyIHRoaXMgcGFydCBwbHVzIGFsbCByZW1haW5pbmcgcGFydHMKKyAgICAgICAgICAgICAgICBvZiB0aGUgcmVzdWx0IHN0cmluZyBhcmUgc3Vic3RpdHV0ZWQ6IDxvcHRpb24+JWN7Tit9PC9vcHRpb24+PC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgIDx0ZXJtPjxvcHRpb24+JHN5c2Zzcm9vdDwvb3B0aW9uPiwgPG9wdGlvbj4lcjwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPlJvb3QgZGlyZWN0b3J5IHdoZXJlIHN5c2ZzIGZpbGUtc3lzdGVtIGlzIG1vdW50ZWQuCisgICAgICAgICAgICAgICAgVXN1c2FsbHksIHRoaXMgdmFsdWUgaXMganVzdCAiL3N5cyIuPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgIDx0ZXJtPjxvcHRpb24+JGNvbmZpZ3s8cmVwbGFjZWFibGU+a2V5PC9yZXBsYWNlYWJsZT59PC9vcHRpb24+LCA8b3B0aW9uPiVnezxyZXBsYWNlYWJsZT5rZXk8L3JlcGxhY2VhYmxlPn08L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT5UaGUgdmFsdWUgb2YgYSBjb25maWd1cmF0aW9uIHZhcmlhYmxlLiBTZWUgQ09ORklHe30gZm9yIG1vcmUgZGV0YWlscy48L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgPHRlcm0+PG9wdGlvbj4lJTwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT5UaGUgJyUnIGNoYXJhY3RlciBpdHNlbGYuPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgIDx0ZXJtPjxvcHRpb24+JCQ8L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+VGhlICckJyBjaGFyYWN0ZXIgaXRzZWxmLjwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgICAgIDwvdmFyaWFibGVsaXN0PgorICAgICAgICAgIDxwYXJhPlRoZSBjb3VudCBvZiBjaGFyYWN0ZXJzIHRvIGJlIHN1YnN0aXR1dGVkIG1heSBiZSBsaW1pdGVkCisgICAgICAgICAgYnkgc3BlY2lmeWluZyB0aGUgZm9ybWF0IGxlbmd0aCB2YWx1ZS4gRm9yIGV4YW1wbGUsICclM3N7ZmlsZX0nCisgICAgICAgICAgd2lsbCBvbmx5IGluc2VydCB0aGUgZmlyc3QgdGhyZWUgY2hhcmFjdGVycyBvZiB0aGUgc3lzZnMKKyAgICAgICAgICBhdHRyaWJ1dGU8L3BhcmE+CisgICAgICAgIDwvcmVmc2VjdDI+CisgICAgICA8L3JlZnNlY3QxPgorCisgICAgICA8cmVmc2VjdDE+PHRpdGxlPkFVVEhPUjwvdGl0bGU+CisgICAgICAgIDxwYXJhPldyaXR0ZW4gYnkgSmFyb3NsYXYgS3lzZWxhIDxlbWFpbD5wZXJleEBwZXJleC5jejwvZW1haWw+PC9wYXJhPgorICAgICAgICA8cGFyYT5Tb21lIHBvcnRpb25zIGFyZSB3cml0dGVuIGJ5IEdyZWcgS3JvYWgtSGFydG1hbiA8ZW1haWw+Z3JlZ0Brcm9haC5jb208L2VtYWlsPiBhbmQKKyAgICAgICAgS2F5IFNpZXZlcnMgPGVtYWlsPmtheS5zaWV2ZXJzQHZyZnkub3JnPC9lbWFpbD4uPC9wYXJhPgorICAgICAgPC9yZWZzZWN0MT4KKworICAgICAgPHJlZnNlY3QxPgorICAgICAgICA8dGl0bGU+U0VFIEFMU088L3RpdGxlPgorICAgICAgICA8cGFyYT48Y2l0ZXJlZmVudHJ5PgorICAgICAgICAgICAgPHJlZmVudHJ5dGl0bGU+YWxzYWN0bDwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjE8L21hbnZvbG51bT4KKyAgICAgICAgICA8L2NpdGVyZWZlbnRyeT48L3BhcmE+CisgICAgICA8L3JlZnNlY3QxPgorICAgIDwvcmVmZW50cnk+CisgIDwvc2VjdGlvbj4KKzwvYXJ0aWNsZT4KZGlmZiAtLWdpdCBhL3Vzci9zaGFyZS9hbHNhL2luaXQvMDBtYWluIGIvYWxzYWN0bC9pbml0LzAwbWFpbgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdXNyL3NoYXJlL2Fsc2EvaW5pdC8wMG1haW4KcmVuYW1lIHRvIGFsc2FjdGwvaW5pdC8wMG1haW4KZGlmZiAtLWdpdCBhL2Fsc2FjdGwvaW5pdC9NYWtlZmlsZS5hbSBiL2Fsc2FjdGwvaW5pdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTJiODNkCi0tLSAvZGV2L251bGwKKysrIGIvYWxzYWN0bC9pbml0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNyBAQAorCitpbml0X2ZpbGVzID0gXAorCTAwbWFpbiBkZWZhdWx0IGhlbHAgaW5mbyB0ZXN0IFwKKwloZGEKK0VYVFJBX0RJU1QgPSAkKGluaXRfZmlsZXMpCithbHNhaW5pdGRpciA9ICQoZGF0YWRpcikvYWxzYS9pbml0CithbHNhaW5pdF9EQVRBID0gJChpbml0X2ZpbGVzKQpkaWZmIC0tZ2l0IGEvYWxzYWN0bC9pbml0L2NhMDEwNiBiL2Fsc2FjdGwvaW5pdC9jYTAxMDYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FmZDRkZgotLS0gL2Rldi9udWxsCisrKyBiL2Fsc2FjdGwvaW5pdC9jYTAxMDYKQEAgLTAsMCArMSwzMSBAQAorIyBDb25maWd1cmF0aW9uIGZvciBDQTAxMDYgZHJpdmVyCisKK0NUTHtyZXNldH09Im1peGVyIgorQ1RMe25hbWV9PSJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgQ1RMe3ZhbHVlfT0iLTIwZEIiCitDVEx7bmFtZX09Ik1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCBDVEx7dmFsdWV9PSJvbiIKK0NUTHtuYW1lfT0iQW5hbG9nIEZyb250IFBsYXliYWNrIFZvbHVtZSIsIENUTHt2YWx1ZX09IjBkQiIKK0NUTHtuYW1lfT0iQW5hbG9nIEZyb250IFBsYXliYWNrIFN3aXRjaCIsIENUTHt2YWx1ZX09Im9uIgorQ1RMe25hbWV9PSJBbmFsb2cgUmVhciBQbGF5YmFjayBWb2x1bWUiLCBDVEx7dmFsdWV9PSIwZEIiCitDVEx7bmFtZX09IkFuYWxvZyBSZWFyIFBsYXliYWNrIFN3aXRjaCIsIENUTHt2YWx1ZX09Im9uIgorQ1RMe25hbWV9PSJBbmFsb2cgQ2VudGVyL0xGRSBQbGF5YmFjayBWb2x1bWUiLCBDVEx7dmFsdWV9PSIwZEIiCitDVEx7bmFtZX09IkFuYWxvZyBDZW50ZXIvTEZFIFBsYXliYWNrIFN3aXRjaCIsIENUTHt2YWx1ZX09Im9uIgorQ1RMe25hbWV9PSJBbmFsb2cgU2lkZSBQbGF5YmFjayBWb2x1bWUiLCBDVEx7dmFsdWV9PSIwZEIiCitDVEx7bmFtZX09IkFuYWxvZyBTaWRlIFBsYXliYWNrIFN3aXRjaCIsIENUTHt2YWx1ZX09Im9uIgorQ1RMe25hbWV9PSJJRUM5NTggRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgQ1RMe3ZhbHVlfT0iMGRCIgorQ1RMe25hbWV9PSJJRUM5NTggUmVhciBQbGF5YmFjayBWb2x1bWUiLCBDVEx7dmFsdWV9PSIwZEIiCitDVEx7bmFtZX09IklFQzk1OCBDZW50ZXIvTEZFIFBsYXliYWNrIFZvbHVtZSIsIENUTHt2YWx1ZX09IjBkQiIKKyMgY2FwdHVyZQorQ1RMe25hbWV9PSJBbmFsb2cgU291cmNlIENhcHR1cmUgRW51bSIsIENUTHt2YWx1ZX09Ik1pYyIKK0NUTHtuYW1lfT0iTWljIENhcHR1cmUgVm9sdW1lIiwgQ1RMe3ZhbHVlfT0iNmRCIgorQ1RMe25hbWV9PSJTaGFyZWQgTWljL0xpbmUgaW4gQ2FwdHVyZSBTd2l0Y2giLCBDVEx7dmFsdWV9PSJNaWMgaW4iCisKKyMgc29tZSB2YXJpYW50cyBoYXZlIGFsc28gQUM5NyBtaXhlcgorCitDVEx7cmVzZXR9PSJtaXhlciIKK0NUTHtuYW1lfT0iQUM5NyBMaW5lIENhcHR1cmUgVm9sdW1lIixQUk9HUkFNIT0iX19jdGxfc2VhcmNoIixHT1RPPSJhYzk3X2VuZCIKK0NUTHtuYW1lfT0iQW5hbG9nIFNvdXJjZSBDYXB0dXJlIEVudW0iLCBDVEx7dmFsdWV9PSJBQzk3IGluIgorQ1RMe25hbWV9PSJBQzk3IE1pYyBDYXB0dXJlIFN3aXRjaCIsICJvbiIKK0NUTHtuYW1lfT0iQUM5NyBNaWMgQ2FwdHVyZSBWYWx1ZSIsICI2ZEIiCitMQUJFTD0iYWM5N19lbmQiCisKK1JFU1VMVD0idHJ1ZSIsIEVYSVQ9InJldHVybiIKZGlmZiAtLWdpdCBhL3Vzci9zaGFyZS9hbHNhL2luaXQvZGVmYXVsdCBiL2Fsc2FjdGwvaW5pdC9kZWZhdWx0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB1c3Ivc2hhcmUvYWxzYS9pbml0L2RlZmF1bHQKcmVuYW1lIHRvIGFsc2FjdGwvaW5pdC9kZWZhdWx0CmRpZmYgLS1naXQgYS91c3Ivc2hhcmUvYWxzYS9pbml0L2hkYSBiL2Fsc2FjdGwvaW5pdC9oZGEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHVzci9zaGFyZS9hbHNhL2luaXQvaGRhCnJlbmFtZSB0byBhbHNhY3RsL2luaXQvaGRhCmRpZmYgLS1naXQgYS91c3Ivc2hhcmUvYWxzYS9pbml0L2hlbHAgYi9hbHNhY3RsL2luaXQvaGVscApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdXNyL3NoYXJlL2Fsc2EvaW5pdC9oZWxwCnJlbmFtZSB0byBhbHNhY3RsL2luaXQvaGVscApkaWZmIC0tZ2l0IGEvdXNyL3NoYXJlL2Fsc2EvaW5pdC9pbmZvIGIvYWxzYWN0bC9pbml0L2luZm8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHVzci9zaGFyZS9hbHNhL2luaXQvaW5mbwpyZW5hbWUgdG8gYWxzYWN0bC9pbml0L2luZm8KZGlmZiAtLWdpdCBhL3Vzci9zaGFyZS9hbHNhL2luaXQvdGVzdCBiL2Fsc2FjdGwvaW5pdC90ZXN0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB1c3Ivc2hhcmUvYWxzYS9pbml0L3Rlc3QKcmVuYW1lIHRvIGFsc2FjdGwvaW5pdC90ZXN0CmRpZmYgLS1naXQgYS9hbHNhY3RsL2luaXRfcGFyc2UuYyBiL2Fsc2FjdGwvaW5pdF9wYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYjUxNWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbHNhY3RsL2luaXRfcGFyc2UuYwpAQCAtMCwwICsxLDE3NzcgQEAKKy8qCisgKiAgQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlIENvbnRyb2wgUHJvZ3JhbSAtIFBhcnNlIGluaXRpYWxpemF0aW9uIGZpbGVzCisgKiAgQ29weXJpZ2h0IChjKSBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PiwKKyAqCQkgICAgIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+LAorICoJCSAgICAgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICoKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZubWF0Y2guaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxhbHNhL2Fzb3VuZGxpYi5oPgorI2luY2x1ZGUgImFjb25maWcuaCIKKyNpbmNsdWRlICJhbHNhY3RsLmgiCisjaW5jbHVkZSAibGlzdC5oIgorCisjZGVmaW5lIFBBVEhfU0laRQk1MTIKKyNkZWZpbmUgTkFNRV9TSVpFCTEyOAorI2RlZmluZSBFSlVTVFJFVFVSTgkweDdmZmZmZmZmCisKK2VudW0ga2V5X29wIHsKKwlLRVlfT1BfVU5TRVQsCisJS0VZX09QX01BVENILAorCUtFWV9PUF9OT01BVENILAorCUtFWV9PUF9BREQsCisJS0VZX09QX0FTU0lHTiwKKwlLRVlfT1BfQVNTSUdOX0ZJTkFMCit9OworCitzdHJ1Y3QgcGFpciB7CisJY2hhciAqa2V5OworCWNoYXIgKnZhbHVlOworCXN0cnVjdCBwYWlyICpuZXh0OworfTsKKworc3RydWN0IHNwYWNlIHsKKwlzdHJ1Y3QgcGFpciAqcGFpcnM7CisJY2hhciAqcm9vdGRpcjsKKwljaGFyICpnb190bzsKKwljaGFyICpwcm9ncmFtX3Jlc3VsdDsKKwljb25zdCBjaGFyICpmaWxlbmFtZTsKKwlpbnQgbGluZW51bTsKKwlpbnQgbG9nX3J1bjsKKwlpbnQgZXhpdF9jb2RlOworCWludCBxdWl0OworCXVuc2lnbmVkIGludCBjdGxfaWRfY2hhbmdlZDsKKwlzbmRfaGN0bF90ICpjdGxfaGFuZGxlOworCXNuZF9jdGxfY2FyZF9pbmZvX3QgKmN0bF9jYXJkX2luZm87CisJc25kX2N0bF9lbGVtX2lkX3QgKmN0bF9pZDsKKwlzbmRfY3RsX2VsZW1faW5mb190ICpjdGxfaW5mbzsKKwlzbmRfY3RsX2VsZW1fdmFsdWVfdCAqY3RsX3ZhbHVlOworfTsKKworc3RhdGljIHZvaWQgUGVycm9yKHN0cnVjdCBzcGFjZSAqc3BhY2UsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnOworCXZhX3N0YXJ0KGFyZywgZm10KTsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiVpOiAiLCBzcGFjZS0+ZmlsZW5hbWUsIHNwYWNlLT5saW5lbnVtKTsKKwl2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXJnKTsKKwlwdXRjKCdcbicsIHN0ZGVycik7CisJdmFfZW5kKGFyZyk7Cit9CisKKyNpbmNsdWRlICJpbml0X3N5c2RlcHMuYyIKKyNpbmNsdWRlICJpbml0X3V0aWxzX3N0cmluZy5jIgorI2luY2x1ZGUgImluaXRfdXRpbHNfcnVuLmMiCisjaW5jbHVkZSAiaW5pdF9zeXNmcy5jIgorCitzdGF0aWMgdm9pZCBmcmVlX3NwYWNlKHN0cnVjdCBzcGFjZSAqc3BhY2UpCit7CisJc3RydWN0IHBhaXIgKnBhaXIgPSBzcGFjZS0+cGFpcnM7CisJc3RydWN0IHBhaXIgKm5leHQgPSBwYWlyOworCisJd2hpbGUgKG5leHQpIHsKKwkJcGFpciA9IG5leHQ7CisJCW5leHQgPSBwYWlyLT5uZXh0OworCQlmcmVlKHBhaXItPnZhbHVlKTsKKwkJZnJlZShwYWlyLT5rZXkpOworCQlmcmVlKHBhaXIpOworCX0KKwlzcGFjZS0+cGFpcnMgPSBOVUxMOworCWlmIChzcGFjZS0+Y3RsX3ZhbHVlKSB7CisJCXNuZF9jdGxfZWxlbV92YWx1ZV9mcmVlKHNwYWNlLT5jdGxfdmFsdWUpOworCQlzcGFjZS0+Y3RsX3ZhbHVlID0gTlVMTDsKKwl9CisJaWYgKHNwYWNlLT5jdGxfaW5mbykgeworCQlzbmRfY3RsX2VsZW1faW5mb19mcmVlKHNwYWNlLT5jdGxfaW5mbyk7CisJCXNwYWNlLT5jdGxfaW5mbyA9IE5VTEw7CisJfQorCWlmIChzcGFjZS0+Y3RsX2lkKSB7CisJCXNuZF9jdGxfZWxlbV9pZF9mcmVlKHNwYWNlLT5jdGxfaWQpOworCQlzcGFjZS0+Y3RsX2lkID0gTlVMTDsKKwl9CisJaWYgKHNwYWNlLT5jdGxfY2FyZF9pbmZvKSB7CisJCXNuZF9jdGxfY2FyZF9pbmZvX2ZyZWUoc3BhY2UtPmN0bF9jYXJkX2luZm8pOworCQlzcGFjZS0+Y3RsX2NhcmRfaW5mbyA9IE5VTEw7CisJfQorCWlmIChzcGFjZS0+Y3RsX2hhbmRsZSkgeworCQlzbmRfaGN0bF9jbG9zZShzcGFjZS0+Y3RsX2hhbmRsZSk7CisJCXNwYWNlLT5jdGxfaGFuZGxlID0gTlVMTDsKKwl9CisJaWYgKHNwYWNlLT5yb290ZGlyKQorCQlmcmVlKHNwYWNlLT5yb290ZGlyKTsKKwlpZiAoc3BhY2UtPnByb2dyYW1fcmVzdWx0KQorCQlmcmVlKHNwYWNlLT5wcm9ncmFtX3Jlc3VsdCk7CisJaWYgKHNwYWNlLT5nb190bykKKwkJZnJlZShzcGFjZS0+Z29fdG8pOworCWZyZWUoc3BhY2UpOworfQorCitzdGF0aWMgc3RydWN0IHBhaXIgKnZhbHVlX2ZpbmQoc3RydWN0IHNwYWNlICpzcGFjZSwgY29uc3QgY2hhciAqa2V5KQoreworCXN0cnVjdCBwYWlyICpwYWlyID0gc3BhY2UtPnBhaXJzOworCQorCXdoaWxlIChwYWlyICYmIHN0cmNtcChwYWlyLT5rZXksIGtleSkgIT0gMCkKKwkJcGFpciA9IHBhaXItPm5leHQ7CisJcmV0dXJuIHBhaXI7Cit9CisKK3N0YXRpYyBpbnQgdmFsdWVfc2V0KHN0cnVjdCBzcGFjZSAqc3BhY2UsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJc3RydWN0IHBhaXIgKnBhaXI7CisJCisJcGFpciA9IHZhbHVlX2ZpbmQoc3BhY2UsIGtleSk7CisJaWYgKHBhaXIpIHsKKwkJZnJlZShwYWlyLT52YWx1ZSk7CisJCXBhaXItPnZhbHVlID0gc3RyZHVwKHZhbHVlKTsKKwkJaWYgKHBhaXItPnZhbHVlID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9IGVsc2UgeworCQlwYWlyID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGFpcikpOworCQlpZiAocGFpciA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXBhaXItPmtleSA9IHN0cmR1cChrZXkpOworCQlpZiAocGFpci0+a2V5ID09IE5VTEwpIHsKKwkJCWZyZWUocGFpcik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlwYWlyLT52YWx1ZSA9IHN0cmR1cCh2YWx1ZSk7CisJCWlmIChwYWlyLT52YWx1ZSA9PSBOVUxMKSB7CisJCQlmcmVlKHBhaXItPmtleSk7CisJCQlmcmVlKHBhaXIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJcGFpci0+bmV4dCA9IHNwYWNlLT5wYWlyczsKKwkJc3BhY2UtPnBhaXJzID0gcGFpcjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9zcGFjZShzdHJ1Y3Qgc3BhY2UgKipzcGFjZSwgaW50IGNhcmQpCit7CisJc3RydWN0IHNwYWNlICpyZXM7CisJY2hhciBkZXZpY2VbMTZdOworCWludCBlcnI7CisKKwlyZXMgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBzcGFjZSkpOworCWlmIChyZXMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmVzLT5jdGxfaWRfY2hhbmdlZCA9IH4wOworCXJlcy0+bGluZW51bSA9IC0xOworCXNwcmludGYoZGV2aWNlLCAiaHc6JXUiLCBjYXJkKTsKKwllcnIgPSBzbmRfaGN0bF9vcGVuKCZyZXMtPmN0bF9oYW5kbGUsIGRldmljZSwgMCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CisJZXJyID0gc25kX2hjdGxfbG9hZChyZXMtPmN0bF9oYW5kbGUpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm9yOworCWVyciA9IHNuZF9jdGxfY2FyZF9pbmZvX21hbGxvYygmcmVzLT5jdGxfY2FyZF9pbmZvKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKKwllcnIgPSBzbmRfY3RsX2NhcmRfaW5mbyhzbmRfaGN0bF9jdGwocmVzLT5jdGxfaGFuZGxlKSwgcmVzLT5jdGxfY2FyZF9pbmZvKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKKwllcnIgPSBzbmRfY3RsX2VsZW1faWRfbWFsbG9jKCZyZXMtPmN0bF9pZCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CisJZXJyID0gc25kX2N0bF9lbGVtX2luZm9fbWFsbG9jKCZyZXMtPmN0bF9pbmZvKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKKwllcnIgPSBzbmRfY3RsX2VsZW1fdmFsdWVfbWFsbG9jKCZyZXMtPmN0bF92YWx1ZSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CisJKnNwYWNlID0gcmVzOworCXJldHVybiAwOworIGVycm9yOgorIAlmcmVlX3NwYWNlKHJlcyk7CisgCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpjYXJkaW5mb19nZXQoc3RydWN0IHNwYWNlICpzcGFjZSwgY29uc3QgY2hhciAqYXR0cikKK3sKKwlpZiAoc3RybmNhc2VjbXAoYXR0ciwgIkNBUkQiLCA0KSA9PSAwKSB7CisJCXN0YXRpYyBjaGFyIHJlc1sxNl07CisJCXNwcmludGYocmVzLCAiJXUiLCBzbmRfY3RsX2NhcmRfaW5mb19nZXRfY2FyZChzcGFjZS0+Y3RsX2NhcmRfaW5mbykpOworCQlyZXR1cm4gcmVzOworCX0KKwlpZiAoc3RybmNhc2VjbXAoYXR0ciwgIklEIiwgMikgPT0gMCkKKwkJcmV0dXJuIHNuZF9jdGxfY2FyZF9pbmZvX2dldF9pZChzcGFjZS0+Y3RsX2NhcmRfaW5mbyk7CisJaWYgKHN0cm5jYXNlY21wKGF0dHIsICJEUklWRVIiLCA2KSA9PSAwKQorCQlyZXR1cm4gc25kX2N0bF9jYXJkX2luZm9fZ2V0X2RyaXZlcihzcGFjZS0+Y3RsX2NhcmRfaW5mbyk7CisJaWYgKHN0cm5jYXNlY21wKGF0dHIsICJOQU1FIiwgNCkgPT0gMCkKKwkJcmV0dXJuIHNuZF9jdGxfY2FyZF9pbmZvX2dldF9uYW1lKHNwYWNlLT5jdGxfY2FyZF9pbmZvKTsKKwlpZiAoc3RybmNhc2VjbXAoYXR0ciwgIkxPTkdOQU1FIiwgOCkgPT0gMCkKKwkJcmV0dXJuIHNuZF9jdGxfY2FyZF9pbmZvX2dldF9sb25nbmFtZShzcGFjZS0+Y3RsX2NhcmRfaW5mbyk7CisJaWYgKHN0cm5jYXNlY21wKGF0dHIsICJNSVhFUk5BTUUiLCA5KSA9PSAwKQorCQlyZXR1cm4gc25kX2N0bF9jYXJkX2luZm9fZ2V0X21peGVybmFtZShzcGFjZS0+Y3RsX2NhcmRfaW5mbyk7CisJaWYgKHN0cm5jYXNlY21wKGF0dHIsICJDT01QT05FTlRTIiwgMTApID09IDApCisJCXJldHVybiBzbmRfY3RsX2NhcmRfaW5mb19nZXRfY29tcG9uZW50cyhzcGFjZS0+Y3RsX2NhcmRfaW5mbyk7CisJUGVycm9yKHNwYWNlLCAidW5rbm93biBjYXJkaW5mb3t9IGF0dHJpYnV0ZSAnJXMnIiwgYXR0cik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfaWRfY2hhbmdlZChzdHJ1Y3Qgc3BhY2UgKnNwYWNlLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlzbmRfaGN0bF9lbGVtX3QgKmVsZW07CisJaW50IGVycjsKKworCWlmICgoc3BhY2UtPmN0bF9pZF9jaGFuZ2VkICYgd2hhdCAmIDEpICE9IDApIHsKKwkJc25kX2N0bF9lbGVtX2lkX3NldF9udW1pZChzcGFjZS0+Y3RsX2lkLCAwKTsKKwkJZWxlbSA9IHNuZF9oY3RsX2ZpbmRfZWxlbShzcGFjZS0+Y3RsX2hhbmRsZSwgc3BhY2UtPmN0bF9pZCk7CisJCWlmICghZWxlbSkKKwkJCXJldHVybiAtRU5PRU5UOworCQllcnIgPSBzbmRfaGN0bF9lbGVtX2luZm8oZWxlbSwgc3BhY2UtPmN0bF9pbmZvKTsKKwkJaWYgKGVyciA9PSAwKQorCQkJc3BhY2UtPmN0bF9pZF9jaGFuZ2VkICY9IH4xOworCQlyZXR1cm4gZXJyOworCX0KKwlpZiAoKHNwYWNlLT5jdGxfaWRfY2hhbmdlZCAmIHdoYXQgJiAyKSAhPSAwKSB7CisJCXNuZF9jdGxfZWxlbV9pZF9zZXRfbnVtaWQoc3BhY2UtPmN0bF9pZCwgMCk7CisJCWVsZW0gPSBzbmRfaGN0bF9maW5kX2VsZW0oc3BhY2UtPmN0bF9oYW5kbGUsIHNwYWNlLT5jdGxfaWQpOworCQlpZiAoIWVsZW0pCisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJZXJyID0gc25kX2hjdGxfZWxlbV9yZWFkKGVsZW0sIHNwYWNlLT5jdGxfdmFsdWUpOworCQlpZiAoZXJyID09IDApCisJCQlzcGFjZS0+Y3RsX2lkX2NoYW5nZWQgJj0gfjI7CisJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X2N0bF92YWx1ZShzdHJ1Y3Qgc3BhY2UgKnNwYWNlKQoreworCXNuZF9jdGxfZWxlbV90eXBlX3QgdHlwZTsKKwl1bnNpZ25lZCBpbnQgaWR4LCBjb3VudDsKKwlzdGF0aWMgY2hhciByZXNbMTAyNF0sIHRtcFsxNl07CisJc3RhdGljIGNvbnN0IGNoYXIgaGV4W10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisJY2hhciAqcG9zOworCWNvbnN0IGNoYXIgKnBvczE7CisKKwl0eXBlID0gc25kX2N0bF9lbGVtX2luZm9fZ2V0X3R5cGUoc3BhY2UtPmN0bF9pbmZvKTsKKwljb3VudCA9IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9jb3VudChzcGFjZS0+Y3RsX2luZm8pOworCXJlc1swXSA9ICdcMCc7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTTkRfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOgorCQlmb3IgKGlkeCA9IDA7IGlkeCA8IGNvdW50OyBpZHgrKykgeworCQkJaWYgKGlkeCA+IDApCisJCQkJc3RybGNhdChyZXMsICIsIiwgc2l6ZW9mKHJlcykpOworCQkJc3RybGNhdChyZXMsIHNuZF9jdGxfZWxlbV92YWx1ZV9nZXRfYm9vbGVhbihzcGFjZS0+Y3RsX3ZhbHVlLCBpZHgpID8gIm9uIiA6ICJvZmYiLCBzaXplb2YocmVzKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOgorCQlmb3IgKGlkeCA9IDA7IGlkeCA8IGNvdW50OyBpZHgrKykgeworCQkJaWYgKGlkeCA+IDApCisJCQkJc3RybGNhdChyZXMsICIsIiwgc2l6ZW9mKHJlcykpOworCQkJc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIiVsaSIsIHNuZF9jdGxfZWxlbV92YWx1ZV9nZXRfaW50ZWdlcihzcGFjZS0+Y3RsX3ZhbHVlLCBpZHgpKTsKKwkJCXN0cmxjYXQocmVzLCB0bXAsIHNpemVvZihyZXMpKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNORF9DVExfRUxFTV9UWVBFX0lOVEVHRVI2NDoKKwkJZm9yIChpZHggPSAwOyBpZHggPCBjb3VudDsgaWR4KyspIHsKKwkJCWlmIChpZHggPiAwKQorCQkJCXN0cmxjYXQocmVzLCAiLCIsIHNpemVvZihyZXMpKTsKKwkJCXNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICIlbGxpIiwgc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9pbnRlZ2VyNjQoc3BhY2UtPmN0bF92YWx1ZSwgaWR4KSk7CisJCQlzdHJsY2F0KHJlcywgdG1wLCBzaXplb2YocmVzKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOgorCQlmb3IgKGlkeCA9IDA7IGlkeCA8IGNvdW50OyBpZHgrKykgeworCQkJaWYgKGlkeCA+IDApCisJCQkJc3RybGNhdChyZXMsICIsIiwgc2l6ZW9mKHJlcykpOworCQkJc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIiV1Iiwgc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9lbnVtZXJhdGVkKHNwYWNlLT5jdGxfdmFsdWUsIGlkeCkpOworCQkJc3RybGNhdChyZXMsIHRtcCwgc2l6ZW9mKHJlcykpOworCQl9CisJCWJyZWFrOworCWNhc2UgU05EX0NUTF9FTEVNX1RZUEVfQllURVM6CisJY2FzZSBTTkRfQ1RMX0VMRU1fVFlQRV9JRUM5NTg6CisJCWlmICh0eXBlID09IFNORF9DVExfRUxFTV9UWVBFX0lFQzk1OCkKKwkJCWNvdW50ID0gc2l6ZW9mKHNuZF9hZXNfaWVjOTU4X3QpOworCQlpZiAoY291bnQgPiAoc2l6ZW9mKHJlcyktMSkvMikKKwkJCWNvdW50ID0gKHNpemVvZihyZXMpLTEvMik7CisJCXBvcyA9IHJlczsKKwkJcG9zMSA9IHNuZF9jdGxfZWxlbV92YWx1ZV9nZXRfYnl0ZXMoc3BhY2UtPmN0bF92YWx1ZSk7CisJCXdoaWxlIChjb3VudCA+IDApIHsKKwkJCWlkeCA9ICpwb3MxKys7CisJCQkqcG9zKysgPSBoZXhbaWR4ID4+IDRdOworCQkJKnBvcysrID0gaGV4W2lkeCAmIDB4MGZdOworCQkJY291bnQrKzsKKwkJfQorCQkqcG9zKysgPSAnXDAnOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlQZXJyb3Ioc3BhY2UsICJ1bmtub3duIGVsZW1lbnQgdHlwZSAnJWknIiwgdHlwZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gcmVzOworfQorCisvKiBGdW5jdGlvbiB0byBjb252ZXJ0IGZyb20gcGVyY2VudGFnZSB0byB2b2x1bWUuIHZhbCA9IHBlcmNlbnRhZ2UgKi8KKyNkZWZpbmUgY29udmVydF9wcmFuZ2UxKHZhbCwgbWluLCBtYXgpIFwKKyAgICAgICAgY2VpbCgodmFsKSAqICgobWF4KSAtIChtaW4pKSAqIDAuMDEgKyAobWluKSkKKworc3RhdGljIGludCBzZXRfY3RsX3ZhbHVlKHN0cnVjdCBzcGFjZSAqc3BhY2UsIGNvbnN0IGNoYXIgKnZhbHVlLCBpbnQgYWxsKQoreworCXNuZF9jdGxfZWxlbV90eXBlX3QgdHlwZTsKKwl1bnNpZ25lZCBpbnQgaWR4LCBpZHgyLCBjb3VudCwgaXRlbXM7CisJY29uc3QgY2hhciAqcG9zLCAqcG9zMjsKKwlzbmRfaGN0bF9lbGVtX3QgKmVsZW07CisJaW50IHZhbDsKKwlsb25nIGx2YWw7CisKKwl0eXBlID0gc25kX2N0bF9lbGVtX2luZm9fZ2V0X3R5cGUoc3BhY2UtPmN0bF9pbmZvKTsKKwljb3VudCA9IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9jb3VudChzcGFjZS0+Y3RsX2luZm8pOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU05EX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjoKKwkJZm9yIChpZHggPSAwOyBpZHggPCBjb3VudDsgaWR4KyspIHsKKwkJCXdoaWxlICgqdmFsdWUgPT0gJyAnKQorCQkJCXZhbHVlKys7CisJCQlpZiAoKnZhbHVlID09ICdcMCcpCisJCQkJZ290byBtaXNzaW5nOworCQkJdmFsID0gc3RybmNhc2VjbXAodmFsdWUsICJ0cnVlIiwgNCkgPT0gMCB8fAorCQkJCXN0cm5jYXNlY21wKHZhbHVlLCAieWVzIiwgMykgPT0gMCB8fAorCQkJCXN0cm5jYXNlY21wKHZhbHVlLCAib24iLCAyKSA9PSAwIHx8CisJCQkJc3RybmNhc2VjbXAodmFsdWUsICIxIiwgMSkgPT0gMDsKKwkJCXNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfYm9vbGVhbihzcGFjZS0+Y3RsX3ZhbHVlLCBpZHgsIHZhbCk7CisJCQlpZiAoYWxsKQorCQkJCWNvbnRpbnVlOworCQkJcG9zID0gc3RyY2hyKHZhbHVlLCAnLCcpOworCQkJdmFsdWUgPSBwb3MgPyBwb3MgKyAxIDogdmFsdWUgKyBzdHJsZW4odmFsdWUpIC0gMTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNORF9DVExfRUxFTV9UWVBFX0lOVEVHRVI6CisJCWZvciAoaWR4ID0gMDsgaWR4IDwgY291bnQ7IGlkeCsrKSB7CisJCQl3aGlsZSAoKnZhbHVlID09ICcgJykKKwkJCQl2YWx1ZSsrOworCQkJcG9zID0gc3RyY2hyKHZhbHVlLCAnLCcpOworCQkJaWYgKHBvcykKKwkJCQkqKGNoYXIgKilwb3MgPSAnXDAnOworCQkJcmVtb3ZlX3RyYWlsaW5nX2NoYXJzKChjaGFyICopdmFsdWUsICcgJyk7CisJCQlpdGVtcyA9IHBvcyA/IHBvcyAtIHZhbHVlIDogc3RybGVuKHZhbHVlKTsKKwkJCWlmIChpdGVtcyA+IDEgJiYgdmFsdWVbaXRlbXMtMV0gPT0gJyUnKSB7CisJCQkJdmFsID0gY29udmVydF9wcmFuZ2UxKHN0cnRvbCh2YWx1ZSwgTlVMTCwgMCksIHNuZF9jdGxfZWxlbV9pbmZvX2dldF9taW4oc3BhY2UtPmN0bF9pbmZvKSwgc25kX2N0bF9lbGVtX2luZm9fZ2V0X21heChzcGFjZS0+Y3RsX2luZm8pKTsKKwkJCQlzbmRfY3RsX2VsZW1fdmFsdWVfc2V0X2ludGVnZXIoc3BhY2UtPmN0bF92YWx1ZSwgaWR4LCB2YWwpOworCQkJfSBlbHNlIGlmIChpdGVtcyA+IDIgJiYgdmFsdWVbaXRlbXMtMl0gPT0gJ2QnICYmIHZhbHVlW2l0ZW1zLTFdID09ICdCJykgeworCQkJCXZhbCA9IHN0cnRvbCh2YWx1ZSwgTlVMTCwgMCkgKiAxMDA7CisJCQkJaWYgKChwb3MyID0gc3RyY2hyKHZhbHVlLCAnLicpKSAhPSBOVUxMKSB7CisJCQkJCWlmIChpc2RpZ2l0KCoocG9zMi0xKSkgJiYgaXNkaWdpdCgqKHBvczItMikpKSB7CisJCQkJCQlpZiAodmFsIDwgMCkKKwkJCQkJCQl2YWwgLT0gc3RydG9sKHBvczIgKyAxLCBOVUxMLCAwKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQl2YWwgKz0gc3RydG9sKHBvczIgKyAxLCBOVUxMLCAwKTsKKwkJCQkJfSBlbHNlIGlmIChpc2RpZ2l0KCoocG9zMi0xKSkpIHsKKwkJCQkJCWlmICh2YWwgPCAwKQorCQkJCQkJCXZhbCAtPSBzdHJ0b2wocG9zMiArIDEsIE5VTEwsIDApICogMTA7CisJCQkJCQllbHNlCisJCQkJCQkJdmFsICs9IHN0cnRvbChwb3MyICsgMSwgTlVMTCwgMCkgKiAxMDsKKwkJCQkJfQorCQkJCX0KKwkJCQl2YWwgPSBzbmRfY3RsX2NvbnZlcnRfZnJvbV9kQihzbmRfaGN0bF9jdGwoc3BhY2UtPmN0bF9oYW5kbGUpLCBzcGFjZS0+Y3RsX2lkLCB2YWwsICZsdmFsLCAtMSk7CisJCQkJaWYgKHZhbCA8IDApIHsKKwkJCQkJZGJnKCJ1bmFibGUgdG8gY29udmVydCBkQiB2YWx1ZSAnJXMnIHRvIGludGVybmFsIGludGVnZXIgcmFuZ2UiLCB2YWx1ZSk7CisJCQkJCXJldHVybiB2YWw7CisJCQkJfQorCQkJCXNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfaW50ZWdlcihzcGFjZS0+Y3RsX3ZhbHVlLCBpZHgsIGx2YWwpOworCQkJfSBlbHNlIHsKKwkJCQlzbmRfY3RsX2VsZW1fdmFsdWVfc2V0X2ludGVnZXIoc3BhY2UtPmN0bF92YWx1ZSwgaWR4LCBzdHJ0b2wodmFsdWUsIE5VTEwsIDApKTsKKwkJCX0KKwkJCWlmIChhbGwpCisJCQkJY29udGludWU7CisJCQl2YWx1ZSA9IHBvcyA/IHBvcyArIDEgOiB2YWx1ZSArIHN0cmxlbih2YWx1ZSkgLSAxOworCQl9CisJCWJyZWFrOworCWNhc2UgU05EX0NUTF9FTEVNX1RZUEVfSU5URUdFUjY0OgorCQlmb3IgKGlkeCA9IDA7IGlkeCA8IGNvdW50OyBpZHgrKykgeworCQkJd2hpbGUgKCp2YWx1ZSA9PSAnICcpCisJCQkJdmFsdWUrKzsKKwkJCXNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfaW50ZWdlcjY0KHNwYWNlLT5jdGxfdmFsdWUsIGlkeCwgc3RydG9sbCh2YWx1ZSwgTlVMTCwgMCkpOworCQkJaWYgKGFsbCkKKwkJCQljb250aW51ZTsKKwkJCXBvcyA9IHN0cmNocih2YWx1ZSwgJywnKTsKKwkJCXZhbHVlID0gcG9zID8gcG9zICsgMSA6IHZhbHVlICsgc3RybGVuKHZhbHVlKSAtIDE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOgorCQlmb3IgKGlkeCA9IDA7IGlkeCA8IGNvdW50OyBpZHgrKykgeworCQkJd2hpbGUgKCp2YWx1ZSA9PSAnICcpCisJCQkJdmFsdWUrKzsKKwkJCXBvcyA9IHN0cmNocih2YWx1ZSwgJywnKTsKKwkJCWlmIChpc2RpZ2l0KHZhbHVlWzBdKSB8fCB2YWx1ZVswXSA9PSAnLScpIHsKKwkJCQlzbmRfY3RsX2VsZW1fdmFsdWVfc2V0X2VudW1lcmF0ZWQoc3BhY2UtPmN0bF92YWx1ZSwgaWR4LCBzdHJ0b2wodmFsdWUsIE5VTEwsIDApKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHBvcykKKwkJCQkJKihjaGFyICopcG9zID0gJ1wwJzsKKwkJCQlyZW1vdmVfdHJhaWxpbmdfY2hhcnMoKGNoYXIgKil2YWx1ZSwgJyAnKTsKKwkJCQlpdGVtcyA9IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9pdGVtcyhzcGFjZS0+Y3RsX2luZm8pOworCQkJCWZvciAoaWR4MiA9IDA7IGlkeDIgPCBpdGVtczsgaWR4MisrKSB7CisJCQkJCXNuZF9jdGxfZWxlbV9pbmZvX3NldF9pdGVtKHNwYWNlLT5jdGxfaW5mbywgaWR4Mik7CisJCQkJCWVsZW0gPSBzbmRfaGN0bF9maW5kX2VsZW0oc3BhY2UtPmN0bF9oYW5kbGUsIHNwYWNlLT5jdGxfaWQpOworCQkJCQlpZiAoZWxlbSA9PSBOVUxMKQorCQkJCQkJcmV0dXJuIC1FTk9FTlQ7CisJCQkJCXZhbCA9IHNuZF9oY3RsX2VsZW1faW5mbyhlbGVtLCBzcGFjZS0+Y3RsX2luZm8pOworCQkJCQlpZiAodmFsIDwgMCkKKwkJCQkJCXJldHVybiB2YWw7CisJCQkJCWlmIChzdHJjYXNlY21wKHNuZF9jdGxfZWxlbV9pbmZvX2dldF9pdGVtX25hbWUoc3BhY2UtPmN0bF9pbmZvKSwgdmFsdWUpID09IDApIHsKKwkJCQkJCXNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfZW51bWVyYXRlZChzcGFjZS0+Y3RsX3ZhbHVlLCBpZHgsIGlkeDIpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKGlkeDIgPj0gaXRlbXMpIHsKKwkJCQkJUGVycm9yKHNwYWNlLCAid3JvbmcgZW51bSBpZGVudGlmaWVyICclcyciLCB2YWx1ZSk7CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCX0KKwkJCWlmIChhbGwpCisJCQkJY29udGludWU7CisJCQl2YWx1ZSA9IHBvcyA/IHBvcyArIDEgOiB2YWx1ZSArIHN0cmxlbih2YWx1ZSkgLSAxOworCQl9CisJCWJyZWFrOworCWNhc2UgU05EX0NUTF9FTEVNX1RZUEVfQllURVM6CisJY2FzZSBTTkRfQ1RMX0VMRU1fVFlQRV9JRUM5NTg6CisJCWlmICh0eXBlID09IFNORF9DVExfRUxFTV9UWVBFX0lFQzk1OCkKKwkJCWNvdW50ID0gc2l6ZW9mKHNuZF9hZXNfaWVjOTU4X3QpOworCQl3aGlsZSAoKnZhbHVlID09ICcgJykKKwkJCXZhbHVlKys7CisJCWlmIChzdHJsZW4odmFsdWUpICE9IGNvdW50ICogMikgeworCQkJUGVycm9yKHNwYWNlLCAiYmFkIGN0bCB2YWx1ZSBoZXhhIGxlbmd0aCAoc2hvdWxkIGJlICV1IGJ5dGVzKSIsIGNvdW50KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWZvciAoaWR4ID0gMDsgaWR4IDwgY291bnQ7IGlkeCArPSAyKSB7CisJCQl2YWwgPSBoZXh0b2RpZ2l0KCoodmFsdWUrKykpIDw8IDQ7CisJCQl2YWwgfD0gaGV4dG9kaWdpdCgqKHZhbHVlKyspKTsKKwkJCWlmICh2YWwgPiAyNTUpIHsKKwkJCQlQZXJyb3Ioc3BhY2UsICJiYWQgY3RsIGhleGEgdmFsdWUiKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCXNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfYnl0ZShzcGFjZS0+Y3RsX3ZhbHVlLCBpZHgsIHZhbCk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUGVycm9yKHNwYWNlLCAidW5rbm93biBlbGVtZW50IHR5cGUgJyVpJyIsIHR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7CisgIG1pc3Npbmc6CisgIAlwcmludGYoIiVpICVpXG4iLCB0eXBlLCBjb3VudCk7CisgIAlQZXJyb3Ioc3BhY2UsICJtaXNzaW5nIHNvbWUgY3RsIHZhbHVlcyAobGluZSAlaSkiLCBzcGFjZS0+bGluZW51bSk7CisgIAlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBkb19tYXRjaChjb25zdCBjaGFyICprZXksIGVudW0ga2V5X29wIG9wLAorCQkgICAgY29uc3QgY2hhciAqa2V5X3ZhbHVlLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpbnQgbWF0Y2g7CisKKwlpZiAodmFsdWUgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJZGJnKCJtYXRjaCAlcyAnJXMnIDwtPiAnJXMnIiwga2V5LCBrZXlfdmFsdWUsIHZhbHVlKTsKKwltYXRjaCA9IGZubWF0Y2goa2V5X3ZhbHVlLCB2YWx1ZSwgMCkgPT0gMDsKKwlpZiAobWF0Y2ggJiYgb3AgPT0gS0VZX09QX01BVENIKSB7CisJCWRiZygiJXMgaXMgdHJ1ZSAobWF0Y2hpbmcgdmFsdWUpIiwga2V5KTsKKwkJcmV0dXJuIDE7CisJfQorCWlmICghbWF0Y2ggJiYgb3AgPT0gS0VZX09QX05PTUFUQ0gpIHsKKwkJZGJnKCIlcyBpcyB0cnVlIChub24tbWF0Y2hpbmcgdmFsdWUpIiwga2V5KTsKKwkJcmV0dXJuIDE7CisJfQorCWRiZygiJXMgaXMgZmFsc2UiLCBrZXkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN0bF9tYXRjaChzbmRfY3RsX2VsZW1faWRfdCAqcGF0dGVybiwgc25kX2N0bF9lbGVtX2lkX3QgKmlkKQoreworCWlmIChzbmRfY3RsX2VsZW1faWRfZ2V0X2ludGVyZmFjZShwYXR0ZXJuKSAhPSAtMSAmJgorCSAgICBzbmRfY3RsX2VsZW1faWRfZ2V0X2ludGVyZmFjZShwYXR0ZXJuKSAhPSBzbmRfY3RsX2VsZW1faWRfZ2V0X2ludGVyZmFjZShpZCkpCisJICAgIAlyZXR1cm4gMDsKKwlpZiAoc25kX2N0bF9lbGVtX2lkX2dldF9kZXZpY2UocGF0dGVybikgIT0gLTEgJiYKKwkgICAgc25kX2N0bF9lbGVtX2lkX2dldF9kZXZpY2UocGF0dGVybikgIT0gc25kX2N0bF9lbGVtX2lkX2dldF9kZXZpY2UoaWQpKQorCQlyZXR1cm4gMDsKKwlpZiAoc25kX2N0bF9lbGVtX2lkX2dldF9zdWJkZXZpY2UocGF0dGVybikgIT0gLTEgJiYKKwkgICAgc25kX2N0bF9lbGVtX2lkX2dldF9zdWJkZXZpY2UocGF0dGVybikgIT0gc25kX2N0bF9lbGVtX2lkX2dldF9zdWJkZXZpY2UoaWQpKQorCSAgICAJcmV0dXJuIDA7CisJaWYgKHNuZF9jdGxfZWxlbV9pZF9nZXRfaW5kZXgocGF0dGVybikgIT0gLTEgJiYKKwkgICAgc25kX2N0bF9lbGVtX2lkX2dldF9pbmRleChwYXR0ZXJuKSAhPSBzbmRfY3RsX2VsZW1faWRfZ2V0X2luZGV4KGlkKSkKKwkgICAgCXJldHVybiAwOworCWlmIChmbm1hdGNoKHNuZF9jdGxfZWxlbV9pZF9nZXRfbmFtZShwYXR0ZXJuKSwgc25kX2N0bF9lbGVtX2lkX2dldF9uYW1lKGlkKSwgMCkgIT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICplbGVtaWRfZ2V0KHN0cnVjdCBzcGFjZSAqc3BhY2UsIGNvbnN0IGNoYXIgKmF0dHIpCit7CisJbG9uZyBsb25nIHZhbDsKKwlzbmRfY3RsX2VsZW1fdHlwZV90IHR5cGU7CisJc3RhdGljIGNoYXIgcmVzWzI1Nl07CisKKwlpZiAoc3RybmNhc2VjbXAoYXR0ciwgIm51bWlkIiwgNSkgPT0gMCkgeworCQl2YWwgPSBzbmRfY3RsX2VsZW1faWRfZ2V0X251bWlkKHNwYWNlLT5jdGxfaWQpOworCSAgICAJZ290byB2YWx1ZTsKKwl9CisJaWYgKHN0cm5jYXNlY21wKGF0dHIsICJpZmFjZSIsIDUpID09IDAgfHwKKwkgICAgc3RybmNhc2VjbXAoYXR0ciwgImludGVyZmFjZSIsIDkpID09IDApCisJICAgIAlyZXR1cm4gc25kX2N0bF9lbGVtX2lmYWNlX25hbWUoc25kX2N0bF9lbGVtX2lkX2dldF9pbnRlcmZhY2Uoc3BhY2UtPmN0bF9pZCkpOworCWlmIChzdHJuY2FzZWNtcChhdHRyLCAiZGV2aWNlIiwgNikgPT0gMCkgeworCQl2YWwgPSBzbmRfY3RsX2VsZW1faWRfZ2V0X2RldmljZShzcGFjZS0+Y3RsX2lkKTsKKwkgICAgCWdvdG8gdmFsdWU7CisJfQorCWlmIChzdHJuY2FzZWNtcChhdHRyLCAic3ViZGV2IiwgNikgPT0gMCkgeworCQl2YWwgPSBzbmRfY3RsX2VsZW1faWRfZ2V0X3N1YmRldmljZShzcGFjZS0+Y3RsX2lkKTsKKwkgICAgCWdvdG8gdmFsdWU7CisJfQorCWlmIChzdHJuY2FzZWNtcChhdHRyLCAibmFtZSIsIDQpID09IDApCisJCXJldHVybiBzbmRfY3RsX2VsZW1faWRfZ2V0X25hbWUoc3BhY2UtPmN0bF9pZCk7CisJaWYgKHN0cm5jYXNlY21wKGF0dHIsICJpbmRleCIsIDUpID09IDApIHsKKwkJdmFsID0gc25kX2N0bF9lbGVtX2lkX2dldF9pbmRleChzcGFjZS0+Y3RsX2lkKTsKKwkgICAgCWdvdG8gdmFsdWU7CisJfQorCWlmIChzdHJuY2FzZWNtcChhdHRyLCAidHlwZSIsIDQpID09IDApIHsKKwkJaWYgKGNoZWNrX2lkX2NoYW5nZWQoc3BhY2UsIDEpKQorCQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBzbmRfY3RsX2VsZW1fdHlwZV9uYW1lKHNuZF9jdGxfZWxlbV9pbmZvX2dldF90eXBlKHNwYWNlLT5jdGxfaW5mbykpOworCX0KKwlpZiAoc3RybmNhc2VjbXAoYXR0ciwgImF0dHIiLCA0KSA9PSAwKSB7CisJCWlmIChjaGVja19pZF9jaGFuZ2VkKHNwYWNlLCAxKSkKKwkJCXJldHVybiBOVUxMOworCQlyZXNbMF0gPSAnXDAnOworCQlpZiAoc25kX2N0bF9lbGVtX2luZm9faXNfcmVhZGFibGUoc3BhY2UtPmN0bF9pbmZvKSkKKwkJCXN0cmNhdChyZXMsICJyIik7CisJCWlmIChzbmRfY3RsX2VsZW1faW5mb19pc193cml0YWJsZShzcGFjZS0+Y3RsX2luZm8pKQorCQkJc3RyY2F0KHJlcywgInciKTsKKwkJaWYgKHNuZF9jdGxfZWxlbV9pbmZvX2lzX3ZvbGF0aWxlKHNwYWNlLT5jdGxfaW5mbykpCisJCQlzdHJjYXQocmVzLCAidiIpOworCQlpZiAoc25kX2N0bF9lbGVtX2luZm9faXNfaW5hY3RpdmUoc3BhY2UtPmN0bF9pbmZvKSkKKwkJCXN0cmNhdChyZXMsICJpIik7CisJCWlmIChzbmRfY3RsX2VsZW1faW5mb19pc19sb2NrZWQoc3BhY2UtPmN0bF9pbmZvKSkKKwkJCXN0cmNhdChyZXMsICJsIik7CisJCWlmIChzbmRfY3RsX2VsZW1faW5mb19pc190bHZfcmVhZGFibGUoc3BhY2UtPmN0bF9pbmZvKSkKKwkJCXN0cmNhdChyZXMsICJSIik7CisJCWlmIChzbmRfY3RsX2VsZW1faW5mb19pc190bHZfd3JpdGFibGUoc3BhY2UtPmN0bF9pbmZvKSkKKwkJCXN0cmNhdChyZXMsICJXIik7CisJCWlmIChzbmRfY3RsX2VsZW1faW5mb19pc190bHZfY29tbWFuZGFibGUoc3BhY2UtPmN0bF9pbmZvKSkKKwkJCXN0cmNhdChyZXMsICJDIik7CisJCWlmIChzbmRfY3RsX2VsZW1faW5mb19pc19vd25lcihzcGFjZS0+Y3RsX2luZm8pKQorCQkJc3RyY2F0KHJlcywgIm8iKTsKKwkJaWYgKHNuZF9jdGxfZWxlbV9pbmZvX2lzX3VzZXIoc3BhY2UtPmN0bF9pbmZvKSkKKwkJCXN0cmNhdChyZXMsICJ1Iik7CisJCXJldHVybiByZXM7CisJfQorCWlmIChzdHJuY2FzZWNtcChhdHRyLCAib3duZXIiLCA1KSA9PSAwKSB7CisJCWlmIChjaGVja19pZF9jaGFuZ2VkKHNwYWNlLCAxKSkKKwkJCXJldHVybiBOVUxMOworCQl2YWwgPSBzbmRfY3RsX2VsZW1faW5mb19nZXRfb3duZXIoc3BhY2UtPmN0bF9pbmZvKTsKKwkJZ290byB2YWx1ZTsKKwl9CisJaWYgKHN0cm5jYXNlY21wKGF0dHIsICJjb3VudCIsIDUpID09IDApIHsKKwkJaWYgKGNoZWNrX2lkX2NoYW5nZWQoc3BhY2UsIDEpKQorCQkJcmV0dXJuIE5VTEw7CisJCXZhbCA9IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9jb3VudChzcGFjZS0+Y3RsX2luZm8pOworCQlnb3RvIHZhbHVlOworCX0KKwlpZiAoc3RybmNhc2VjbXAoYXR0ciwgIm1pbiIsIDMpID09IDApIHsKKwkJaWYgKGNoZWNrX2lkX2NoYW5nZWQoc3BhY2UsIDEpKQorCQkJcmV0dXJuIE5VTEw7CisJCXR5cGUgPSBzbmRfY3RsX2VsZW1faW5mb19nZXRfdHlwZShzcGFjZS0+Y3RsX2luZm8pOworCQlpZiAodHlwZSA9PSBTTkRfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSNjQpCisJCQl2YWwgPSBzbmRfY3RsX2VsZW1faW5mb19nZXRfbWluNjQoc3BhY2UtPmN0bF9pbmZvKTsKKwkJZWxzZSBpZiAodHlwZSA9PSBTTkRfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSKQorCQkJdmFsID0gc25kX2N0bF9lbGVtX2luZm9fZ2V0X21pbihzcGFjZS0+Y3RsX2luZm8pOworCQllbHNlCisJCQlnb3RvIGVtcHR5OworCQlnb3RvIHZhbHVlOworCX0KKwlpZiAoc3RybmNhc2VjbXAoYXR0ciwgIm1heCIsIDMpID09IDApIHsKKwkJaWYgKGNoZWNrX2lkX2NoYW5nZWQoc3BhY2UsIDEpKQorCQkJcmV0dXJuIE5VTEw7CisJCXR5cGUgPSBzbmRfY3RsX2VsZW1faW5mb19nZXRfdHlwZShzcGFjZS0+Y3RsX2luZm8pOworCQlpZiAodHlwZSA9PSBTTkRfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSNjQpCisJCQl2YWwgPSBzbmRfY3RsX2VsZW1faW5mb19nZXRfbWF4NjQoc3BhY2UtPmN0bF9pbmZvKTsKKwkJZWxzZSBpZiAodHlwZSA9PSBTTkRfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSKQorCQkJdmFsID0gc25kX2N0bF9lbGVtX2luZm9fZ2V0X21heChzcGFjZS0+Y3RsX2luZm8pOworCQllbHNlCisJCQlnb3RvIGVtcHR5OworCQlnb3RvIHZhbHVlOworCX0KKwlpZiAoc3RybmNhc2VjbXAoYXR0ciwgInN0ZXAiLCAzKSA9PSAwKSB7CisJCWlmIChjaGVja19pZF9jaGFuZ2VkKHNwYWNlLCAxKSkKKwkJCXJldHVybiBOVUxMOworCQl0eXBlID0gc25kX2N0bF9lbGVtX2luZm9fZ2V0X3R5cGUoc3BhY2UtPmN0bF9pbmZvKTsKKwkJaWYgKHR5cGUgPT0gU05EX0NUTF9FTEVNX1RZUEVfSU5URUdFUjY0KQorCQkJdmFsID0gc25kX2N0bF9lbGVtX2luZm9fZ2V0X3N0ZXA2NChzcGFjZS0+Y3RsX2luZm8pOworCQllbHNlIGlmICh0eXBlID09IFNORF9DVExfRUxFTV9UWVBFX0lOVEVHRVIpCisJCQl2YWwgPSBzbmRfY3RsX2VsZW1faW5mb19nZXRfc3RlcChzcGFjZS0+Y3RsX2luZm8pOworCQllbHNlCisJCQlnb3RvIGVtcHR5OworCQlnb3RvIHZhbHVlOworCX0KKwlpZiAoc3RybmNhc2VjbXAoYXR0ciwgIml0ZW1zIiwgNSkgPT0gMCkgeworCQlpZiAoY2hlY2tfaWRfY2hhbmdlZChzcGFjZSwgMSkpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKHNuZF9jdGxfZWxlbV9pbmZvX2dldF90eXBlKHNwYWNlLT5jdGxfaW5mbykgPT0gU05EX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRCkKKwkJCXZhbCA9IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9pdGVtcyhzcGFjZS0+Y3RsX2luZm8pOworCQllbHNlIHsKKwkJICBlbXB0eToKKwkJCXJlc1swXSA9ICdcMCc7CisJCQlyZXR1cm4gcmVzOworCQl9CisJCWdvdG8gdmFsdWU7CisJfQorCWlmIChzdHJuY2FzZWNtcChhdHRyLCAidmFsdWUiLCA1KSA9PSAwKSB7CisJCWlmIChjaGVja19pZF9jaGFuZ2VkKHNwYWNlLCAzKSkKKwkJCXJldHVybiBOVUxMOworCQlyZXR1cm4gZ2V0X2N0bF92YWx1ZShzcGFjZSk7CisJfQorCWlmIChzdHJuY2FzZWNtcChhdHRyLCAiZEJtaW4iLCA1KSA9PSAwKSB7CisJCWxvbmcgbWluLCBtYXg7CisJCWlmIChjaGVja19pZF9jaGFuZ2VkKHNwYWNlLCAxKSkKKwkJCXJldHVybiBOVUxMOworCQlpZiAoc25kX2N0bF9nZXRfZEJfcmFuZ2Uoc25kX2hjdGxfY3RsKHNwYWNlLT5jdGxfaGFuZGxlKSwgc3BhY2UtPmN0bF9pZCwgJm1pbiwgJm1heCkgPCAwKQorCQkJZ290byBlbXB0eTsKKwkJdmFsID0gbWluOworZGJ2YWx1ZToKKwkJc3ByaW50ZihyZXMsICIlbGkuJTAyaWRCIiwgKGxvbmcpKHZhbCAvIDEwMCksIChpbnQpYWJzKHZhbCAlIDEwMCkpOworCQlyZXR1cm4gcmVzOworCX0KKwlpZiAoc3RybmNhc2VjbXAoYXR0ciwgImRCbWF4IiwgNSkgPT0gMCkgeworCQlsb25nIG1pbiwgbWF4OworCQlpZiAoY2hlY2tfaWRfY2hhbmdlZChzcGFjZSwgMSkpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKHNuZF9jdGxfZ2V0X2RCX3JhbmdlKHNuZF9oY3RsX2N0bChzcGFjZS0+Y3RsX2hhbmRsZSksIHNwYWNlLT5jdGxfaWQsICZtaW4sICZtYXgpIDwgMCkKKwkJCWdvdG8gZW1wdHk7CisJCXZhbCA9IG1heDsKKwkJZ290byBkYnZhbHVlOworCX0KKwlpZiAoc3RybmNhc2VjbXAoYXR0ciwgImVudW1zIiwgNSkgPT0gMCkgeworCQl1bnNpZ25lZCBpbnQgaWR4LCBpdGVtczsKKwkJc25kX2hjdGxfZWxlbV90ICplbGVtOworCQlpZiAoY2hlY2tfaWRfY2hhbmdlZChzcGFjZSwgMSkpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKHNuZF9jdGxfZWxlbV9pbmZvX2dldF90eXBlKHNwYWNlLT5jdGxfaW5mbykgIT0gU05EX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRCkKKwkJCWdvdG8gZW1wdHk7CisJCWl0ZW1zID0gc25kX2N0bF9lbGVtX2luZm9fZ2V0X2l0ZW1zKHNwYWNlLT5jdGxfaW5mbyk7CisJCXN0cmNweShyZXMsICJ8Iik7CisJCWZvciAoaWR4ID0gMDsgaWR4IDwgaXRlbXM7IGlkeCsrKSB7CisJCQlzbmRfY3RsX2VsZW1faW5mb19zZXRfaXRlbShzcGFjZS0+Y3RsX2luZm8sIGlkeCk7CisJCQllbGVtID0gc25kX2hjdGxfZmluZF9lbGVtKHNwYWNlLT5jdGxfaGFuZGxlLCBzcGFjZS0+Y3RsX2lkKTsKKwkJCWlmIChlbGVtID09IE5VTEwpCisJCQkJYnJlYWs7CisJCQlpZiAoc25kX2hjdGxfZWxlbV9pbmZvKGVsZW0sIHNwYWNlLT5jdGxfaW5mbykgPCAwKQorCQkJCWJyZWFrOworCQkJc3RybGNhdChyZXMsIHNuZF9jdGxfZWxlbV9pbmZvX2dldF9pdGVtX25hbWUoc3BhY2UtPmN0bF9pbmZvKSwgc2l6ZW9mKHJlcykpOworCQkJc3RybGNhdChyZXMsICJ8Iiwgc2l6ZW9mKHJlcykpOworCQl9CisJCXJldHVybiByZXM7CisJfQorCWlmIChzdHJuY2FzZWNtcChhdHRyLCAiZG9fc2VhcmNoIiwgOSkgPT0gMCkgeworCQlpbnQgZXJyLCBpbmRleCA9IDA7CisJCXNuZF9oY3RsX2VsZW1fdCAqZWxlbTsKKwkJc25kX2N0bF9lbGVtX2lkX3QgKmlkOworCQljaGFyICpwb3MgPSBzdHJjaHIoYXR0ciwgJyAnKTsKKwkJaWYgKHBvcykKKwkJCWluZGV4ID0gc3RydG9sKHBvcywgTlVMTCwgMCk7CisJCWVyciA9IHNuZF9jdGxfZWxlbV9pZF9tYWxsb2MoJmlkKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gTlVMTDsKKwkJZWxlbSA9IHNuZF9oY3RsX2ZpcnN0X2VsZW0oc3BhY2UtPmN0bF9oYW5kbGUpOworCQl3aGlsZSAoZWxlbSkgeworCQkJc25kX2hjdGxfZWxlbV9nZXRfaWQoZWxlbSwgaWQpOworCQkJaWYgKCFjdGxfbWF0Y2goc3BhY2UtPmN0bF9pZCwgaWQpKQorCQkJCWdvdG8gbmV4dF9zZWFyY2g7CisJCQlpZiAoaW5kZXggPiAwKSB7CisJCQkJaW5kZXgtLTsKKwkJCQlnb3RvIG5leHRfc2VhcmNoOworCQkJfQorCQkJc3RyY3B5KHJlcywgIjEiKTsKKwkJCXNuZF9jdGxfZWxlbV9pZF9jb3B5KHNwYWNlLT5jdGxfaWQsIGlkKTsKKwkJCXNuZF9jdGxfZWxlbV9pZF9mcmVlKGlkKTsKKwkJCWRiZygiZG9fY3RsX3NlYXJjaCBmb3VuZCBhIGNvbnRyb2wiKTsKKwkJCXJldHVybiByZXM7CisJCSAgICAgIG5leHRfc2VhcmNoOgorCQkJZWxlbSA9IHNuZF9oY3RsX2VsZW1fbmV4dChlbGVtKTsKKwkJfQorCQlzbmRfY3RsX2VsZW1faWRfZnJlZShpZCk7CisJCXN0cmNweShyZXMsICIwIik7CisJCXJldHVybiByZXM7CisJfQorCWlmIChzdHJuY2FzZWNtcChhdHRyLCAiZG9fY291bnQiLCA4KSA9PSAwKSB7CisJCWludCBlcnIsIGluZGV4ID0gMDsKKwkJc25kX2hjdGxfZWxlbV90ICplbGVtOworCQlzbmRfY3RsX2VsZW1faWRfdCAqaWQ7CisJCWVyciA9IHNuZF9jdGxfZWxlbV9pZF9tYWxsb2MoJmlkKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gTlVMTDsKKwkJZWxlbSA9IHNuZF9oY3RsX2ZpcnN0X2VsZW0oc3BhY2UtPmN0bF9oYW5kbGUpOworCQl3aGlsZSAoZWxlbSkgeworCQkJc25kX2hjdGxfZWxlbV9nZXRfaWQoZWxlbSwgaWQpOworCQkJaWYgKGN0bF9tYXRjaChzcGFjZS0+Y3RsX2lkLCBpZCkpCisJCQkJaW5kZXgrKzsKKwkJCWVsZW0gPSBzbmRfaGN0bF9lbGVtX25leHQoZWxlbSk7CisJCX0KKwkJc25kX2N0bF9lbGVtX2lkX2ZyZWUoaWQpOworCQlzcHJpbnRmKHJlcywgIiV1IiwgaW5kZXgpOworCQlkYmcoImRvX2N0bF9jb3VudCBmb3VuZCAlcyBjb250cm9scyIsIHJlcyk7CisJCXJldHVybiByZXM7CisJfQorCVBlcnJvcihzcGFjZSwgInVua25vd24gY3Rse30gYXR0cmlidXRlICclcyciLCBhdHRyKTsKKwlyZXR1cm4gTlVMTDsKKyAgdmFsdWU6CisgIAlzcHJpbnRmKHJlcywgIiVsbGkiLCB2YWwpOworICAJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBlbGVtaWRfc2V0KHN0cnVjdCBzcGFjZSAqc3BhY2UsIGNvbnN0IGNoYXIgKmF0dHIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJdm9pZCAoKmZjbikoc25kX2N0bF9lbGVtX2lkX3QgKiwgdW5zaWduZWQgaW50KTsKKwlzbmRfY3RsX2VsZW1faWZhY2VfdCBpZmFjZTsKKwlpbnQgZXJyOworCisJaWYgKHN0cm5jYXNlY21wKGF0dHIsICJudW1pZCIsIDUpID09IDApIHsKKwkJZmNuID0gc25kX2N0bF9lbGVtX2lkX3NldF9udW1pZDsKKwkgICAgCWdvdG8gdmFsdWU7CisJfQorCWlmIChzdHJuY2FzZWNtcChhdHRyLCAiaWZhY2UiLCA1KSA9PSAwIHx8CisJICAgIHN0cm5jYXNlY21wKGF0dHIsICJpbnRlcmZhY2UiLCA5KSA9PSAwIHx8CisJICAgIHN0cm5jYXNlY21wKGF0dHIsICJyZXNldCIsIDUpID09IDAgfHwKKwkgICAgc3RybmNhc2VjbXAoYXR0ciwgInNlYXJjaCIsIDYpID09IDApIHsKKwkgICAgCWlmIChzdHJsZW4odmFsdWUpID09IDAgJiYgc3RybmNhc2VjbXAoYXR0ciwgInNlYXJjaCIsIDYpID09IDApIHsKKwkgICAgCQlpZmFjZSA9IDA7CisJICAgIAkJZ290byBzZWFyY2g7CisJCX0KKwkgICAgCWZvciAoaWZhY2UgPSAwOyBpZmFjZSA8PSBTTkRfQ1RMX0VMRU1fSUZBQ0VfTEFTVDsgaWZhY2UrKykgeworCSAgICAJCWlmIChzdHJjYXNlY21wKHZhbHVlLCBzbmRfY3RsX2VsZW1faWZhY2VfbmFtZShpZmFjZSkpID09IDApIHsKKwkJCSAgICAJaWYgKHN0cm5jYXNlY21wKGF0dHIsICJyZXNldCIsIDUpID09IDApCisJCQkgICAgCQlzbmRfY3RsX2VsZW1faWRfY2xlYXIoc3BhY2UtPmN0bF9pZCk7CisJCQkgICAgCWlmIChzdHJuY2FzZWNtcChhdHRyLCAic2VhcmNoIiwgNSkgPT0gMCkgeworCQkJICAgIAkgIHNlYXJjaDoKKwkJCSAgICAJCXNuZF9jdGxfZWxlbV9pZF9jbGVhcihzcGFjZS0+Y3RsX2lkKTsKKwkJCSAgICAJCS8qIC0xIG1lYW5zIGFsbCAqLworCQkJICAgIAkJc25kX2N0bF9lbGVtX2lkX3NldF9pbnRlcmZhY2Uoc3BhY2UtPmN0bF9pZCwgLTEpOworCQkJICAgIAkJc25kX2N0bF9lbGVtX2lkX3NldF9kZXZpY2Uoc3BhY2UtPmN0bF9pZCwgLTEpOworCQkJICAgIAkJc25kX2N0bF9lbGVtX2lkX3NldF9zdWJkZXZpY2Uoc3BhY2UtPmN0bF9pZCwgLTEpOworCQkJICAgIAkJc25kX2N0bF9lbGVtX2lkX3NldF9uYW1lKHNwYWNlLT5jdGxfaWQsICIqIik7CisJCQkgICAgCQlzbmRfY3RsX2VsZW1faWRfc2V0X2luZGV4KHNwYWNlLT5jdGxfaWQsIC0xKTsKKwkJCSAgICAJCWlmIChzdHJsZW4odmFsdWUpID09IDApCisJCQkgICAgCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCXNuZF9jdGxfZWxlbV9pZF9zZXRfaW50ZXJmYWNlKHNwYWNlLT5jdGxfaWQsIGlmYWNlKTsKKwkJCQlzcGFjZS0+Y3RsX2lkX2NoYW5nZWQgPSB+MDsKKwkJCSAgICAJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJUGVycm9yKHNwYWNlLCAidW5rbm93biBjb250cm9sIGludGVyZmFjZSBuYW1lICclcyciLCB2YWx1ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoc3RybmNhc2VjbXAoYXR0ciwgImRldmljZSIsIDYpID09IDApIHsKKwkJZmNuID0gc25kX2N0bF9lbGVtX2lkX3NldF9kZXZpY2U7CisJICAgIAlnb3RvIHZhbHVlOworCX0KKwlpZiAoc3RybmNhc2VjbXAoYXR0ciwgInN1YmRldiIsIDYpID09IDApIHsKKwkJZmNuID0gc25kX2N0bF9lbGVtX2lkX3NldF9zdWJkZXZpY2U7CisJICAgIAlnb3RvIHZhbHVlOworCX0KKwlpZiAoc3RybmNhc2VjbXAoYXR0ciwgIm5hbWUiLCA0KSA9PSAwKSB7CisJCXNuZF9jdGxfZWxlbV9pZF9zZXRfbmFtZShzcGFjZS0+Y3RsX2lkLCB2YWx1ZSk7CisJICAJc3BhY2UtPmN0bF9pZF9jaGFuZ2VkID0gfjA7CisJCXJldHVybiAwOworCX0KKwlpZiAoc3RybmNhc2VjbXAoYXR0ciwgImluZGV4IiwgNSkgPT0gMCkgeworCQlmY24gPSBzbmRfY3RsX2VsZW1faWRfc2V0X2luZGV4OworCSAgICAJZ290byB2YWx1ZTsKKwl9CisJaWYgKHN0cm5jYXNlY21wKGF0dHIsICJ2YWx1ZXMiLCA2KSA9PSAwIHx8CisJICAgIHN0cm5jYXNlY21wKGF0dHIsICJ2YWx1ZSIsIDUpID09IDApIHsKKwkJZXJyID0gY2hlY2tfaWRfY2hhbmdlZChzcGFjZSwgMSk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlQZXJyb3Ioc3BhY2UsICJjb250cm9sIGVsZW1lbnQgbm90IGZvdW5kIik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWVyciA9IHNldF9jdGxfdmFsdWUoc3BhY2UsIHZhbHVlLCBzdHJuY2FzZWNtcChhdHRyLCAidmFsdWVzIiwgNikgPT0gMCk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlzcGFjZS0+Y3RsX2lkX2NoYW5nZWQgfD0gMjsKKwkJfSBlbHNlIHsKKwkJCXNwYWNlLT5jdGxfaWRfY2hhbmdlZCAmPSB+MjsKKwkJCXNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfaWQoc3BhY2UtPmN0bF92YWx1ZSwgc3BhY2UtPmN0bF9pZCk7CisJCQllcnIgPSBzbmRfY3RsX2VsZW1fd3JpdGUoc25kX2hjdGxfY3RsKHNwYWNlLT5jdGxfaGFuZGxlKSwgc3BhY2UtPmN0bF92YWx1ZSk7CisJCQlpZiAoZXJyIDwgMCkgeworCQkJCVBlcnJvcihzcGFjZSwgInZhbHVlIHdyaXRlIGVycm9yOiAlcyIsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQorCQl9CisJICAgIAlyZXR1cm4gZXJyOworCX0KKwlQZXJyb3Ioc3BhY2UsICJ1bmtub3duIENUTHt9IGF0dHJpYnV0ZSAnJXMnIiwgYXR0cik7CisJcmV0dXJuIC1FSU5WQUw7CisgIHZhbHVlOgorICAJdmFsID0gKHVuc2lnbmVkIGludClzdHJ0b2wodmFsdWUsIE5VTEwsIDApOworICAJZmNuKHNwYWNlLT5jdGxfaWQsIHZhbCk7CisgIAlzcGFjZS0+Y3RsX2lkX2NoYW5nZWQgPSB+MDsKKyAgCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9rZXkoY2hhciAqKmxpbmUsIGNoYXIgKiprZXksIGVudW0ga2V5X29wICpvcCwgY2hhciAqKnZhbHVlKQoreworCWNoYXIgKmxpbmVwb3M7CisJY2hhciAqdGVtcDsKKworCWxpbmVwb3MgPSAqbGluZTsKKwlpZiAobGluZXBvcyA9PSBOVUxMICYmIGxpbmVwb3NbMF0gPT0gJ1wwJykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBza2lwIHdoaXRlc3BhY2UgKi8KKwl3aGlsZSAoaXNzcGFjZShsaW5lcG9zWzBdKSB8fCBsaW5lcG9zWzBdID09ICcsJykKKwkJbGluZXBvcysrOworCisJLyogZ2V0IHRoZSBrZXkgKi8KKwlpZiAobGluZXBvc1swXSA9PSAnXDAnKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkqa2V5ID0gbGluZXBvczsKKworCXdoaWxlICgxKSB7CisJCWxpbmVwb3MrKzsKKwkJaWYgKGxpbmVwb3NbMF0gPT0gJ1wwJykKKwkJCXJldHVybiAtMTsKKwkJaWYgKGlzc3BhY2UobGluZXBvc1swXSkpCisJCQlicmVhazsKKwkJaWYgKGxpbmVwb3NbMF0gPT0gJz0nKQorCQkJYnJlYWs7CisJCWlmIChsaW5lcG9zWzBdID09ICcrJykKKwkJCWJyZWFrOworCQlpZiAobGluZXBvc1swXSA9PSAnIScpCisJCQlicmVhazsKKwkJaWYgKGxpbmVwb3NbMF0gPT0gJzonKQorCQkJYnJlYWs7CisJfQorCisJLyogcmVtZW1iZXIgZW5kIG9mIGtleSAqLworCXRlbXAgPSBsaW5lcG9zOworCisJLyogc2tpcCB3aGl0ZXNwYWNlIGFmdGVyIGtleSAqLworCXdoaWxlIChpc3NwYWNlKGxpbmVwb3NbMF0pKQorCQlsaW5lcG9zKys7CisJaWYgKGxpbmVwb3NbMF0gPT0gJ1wwJykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBnZXQgb3BlcmF0aW9uIHR5cGUgKi8KKwlpZiAobGluZXBvc1swXSA9PSAnPScgJiYgbGluZXBvc1sxXSA9PSAnPScpIHsKKwkJKm9wID0gS0VZX09QX01BVENIOworCQlsaW5lcG9zICs9IDI7CisJCWRiZygib3BlcmF0b3I9bWF0Y2giKTsKKwl9IGVsc2UgaWYgKGxpbmVwb3NbMF0gPT0gJyEnICYmIGxpbmVwb3NbMV0gPT0gJz0nKSB7CisJCSpvcCA9IEtFWV9PUF9OT01BVENIOworCQlsaW5lcG9zICs9IDI7CisJCWRiZygib3BlcmF0b3I9bm9tYXRjaCIpOworCX0gZWxzZSBpZiAobGluZXBvc1swXSA9PSAnKycgJiYgbGluZXBvc1sxXSA9PSAnPScpIHsKKwkJKm9wID0gS0VZX09QX0FERDsKKwkJbGluZXBvcyArPSAyOworCQlkYmcoIm9wZXJhdG9yPWFkZCIpOworCX0gZWxzZSBpZiAobGluZXBvc1swXSA9PSAnPScpIHsKKwkJKm9wID0gS0VZX09QX0FTU0lHTjsKKwkJbGluZXBvcysrOworCQlkYmcoIm9wZXJhdG9yPWFzc2lnbiIpOworCX0gZWxzZSBpZiAobGluZXBvc1swXSA9PSAnOicgJiYgbGluZXBvc1sxXSA9PSAnPScpIHsKKwkJKm9wID0gS0VZX09QX0FTU0lHTl9GSU5BTDsKKwkJbGluZXBvcyArPSAyOworCQlkYmcoIm9wZXJhdG9yPWFzc2lnbl9maW5hbCIpOworCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHRlcm1pbmF0ZSBrZXkgKi8KKwl0ZW1wWzBdID0gJ1wwJzsKKwlkYmcoImtleT0nJXMnIiwgKmtleSk7CisKKwkvKiBza2lwIHdoaXRlc3BhY2UgYWZ0ZXIgb3BlcmF0b3IgKi8KKwl3aGlsZSAoaXNzcGFjZShsaW5lcG9zWzBdKSkKKwkJbGluZXBvcysrOworCWlmIChsaW5lcG9zWzBdID09ICdcMCcpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogZ2V0IHRoZSB2YWx1ZSovCisJaWYgKGxpbmVwb3NbMF0gIT0gJyInKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlsaW5lcG9zKys7CisJKnZhbHVlID0gbGluZXBvczsKKworCXdoaWxlICgxKSB7CisJCXRlbXAgPSBzdHJjaHIobGluZXBvcywgJyInKTsKKwkJaWYgKHRlbXAgJiYgdGVtcFstMV0gPT0gJ1xcJykgeworCQkJbGluZXBvcyA9IHRlbXAgKyAxOworCQkJY29udGludWU7CisJCX0KKwkJYnJlYWs7CisJfQorCWlmICghdGVtcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJdGVtcFswXSA9ICdcMCc7CisJdGVtcCsrOworCWRiZygidmFsdWU9JyVzJyIsICp2YWx1ZSk7CisKKwkvKiBtb3ZlIGxpbmUgdG8gbmV4dCBrZXkgKi8KKwkqbGluZSA9IHRlbXA7CisKKwlyZXR1cm4gMDsKK30KKworLyogZXh0cmFjdCBwb3NzaWJsZSBLRVl7YXR0cn0gKi8KK3N0YXRpYyBjaGFyICpnZXRfa2V5X2F0dHJpYnV0ZShzdHJ1Y3Qgc3BhY2UgKnNwYWNlLCBjaGFyICpzdHIsIGNoYXIgKnJlcywgc2l6ZV90IHJlc3NpemUpCit7CisJY2hhciAqcG9zOworCWNoYXIgKmF0dHI7CisKKwlhdHRyID0gc3RyY2hyKHN0ciwgJ3snKTsKKwlpZiAoYXR0ciAhPSBOVUxMKSB7CisJCWF0dHIrKzsKKwkJcG9zID0gc3RyY2hyKGF0dHIsICd9Jyk7CisJCWlmIChwb3MgPT0gTlVMTCkgeworCQkJUGVycm9yKHNwYWNlLCAibWlzc2luZyBjbG9zaW5nIGJyYWNlIGZvciBmb3JtYXQiKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXBvc1swXSA9ICdcMCc7CisJCXN0cmxjcHkocmVzLCBhdHRyLCByZXNzaXplKTsKKwkJcG9zWzBdID0gJ30nOworCQlkYmcoImF0dHJpYnV0ZT0nJXMnIiwgcmVzKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogZXh0cmFjdCBwb3NzaWJsZSB7YXR0cn0gYW5kIG1vdmUgc3RyIGJlaGluZCBpdCAqLworc3RhdGljIGNoYXIgKmdldF9mb3JtYXRfYXR0cmlidXRlKHN0cnVjdCBzcGFjZSAqc3BhY2UsIGNoYXIgKipzdHIpCit7CisJY2hhciAqcG9zOworCWNoYXIgKmF0dHIgPSBOVUxMOworCisJaWYgKCpzdHJbMF0gPT0gJ3snKSB7CisJCXBvcyA9IHN0cmNocigqc3RyLCAnfScpOworCQlpZiAocG9zID09IE5VTEwpIHsKKwkJCVBlcnJvcihzcGFjZSwgIm1pc3NpbmcgY2xvc2luZyBicmFjZSBmb3IgZm9ybWF0Iik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlwb3NbMF0gPSAnXDAnOworCQlhdHRyID0gKnN0cisxOworCQkqc3RyID0gcG9zKzE7CisJCWRiZygiYXR0cmlidXRlPSclcycsIHN0cj0nJXMnIiwgYXR0ciwgKnN0cik7CisJfQorCXJldHVybiBhdHRyOworfQorCisvKiBleHRyYWN0IHBvc3NpYmxlIGZvcm1hdCBsZW5ndGggYW5kIG1vdmUgc3RyIGJlaGluZCBpdCovCitzdGF0aWMgaW50IGdldF9mb3JtYXRfbGVuKHN0cnVjdCBzcGFjZSAqc3BhY2UsIGNoYXIgKipzdHIpCit7CisJaW50IG51bTsKKwljaGFyICp0YWlsOworCisJaWYgKGlzZGlnaXQoKnN0clswXSkpIHsKKwkJbnVtID0gKGludCkgc3RydG91bCgqc3RyLCAmdGFpbCwgMTApOworCQlpZiAobnVtID4gMCkgeworCQkJKnN0ciA9IHRhaWw7CisJCQlkYmcoImZvcm1hdCBsZW5ndGg9JWkiLCBudW0pOworCQkJcmV0dXJuIG51bTsKKwkJfSBlbHNlIHsKKwkJCVBlcnJvcihzcGFjZSwgImZvcm1hdCBwYXJzaW5nIGVycm9yICclcyciLCAqc3RyKTsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGFwcGx5X2Zvcm1hdChzdHJ1Y3Qgc3BhY2UgKnNwYWNlLCBjaGFyICpzdHJpbmcsIHNpemVfdCBtYXhzaXplKQoreworCWNoYXIgdGVtcFtQQVRIX1NJWkVdOworCWNoYXIgdGVtcDJbUEFUSF9TSVpFXTsKKwljaGFyICpoZWFkLCAqdGFpbCwgKnBvcywgKmNwb3MsICphdHRyLCAqcmVzdDsKKwlzdHJ1Y3QgcGFpciAqcGFpcjsKKwlpbnQgbGVuOworCWludCBpOworCWludCBjb3VudDsKKwllbnVtIHN1YnN0X3R5cGUgeworCQlTVUJTVF9VTktOT1dOLAorCQlTVUJTVF9DQVJESU5GTywKKwkJU1VCU1RfQ1RMLAorCQlTVUJTVF9SRVNVTFQsCisJCVNVQlNUX0FUVFIsCisJCVNVQlNUX1NZU0ZTUk9PVCwKKwkJU1VCU1RfRU5WLAorCQlTVUJTVF9DT05GSUcsCisJfTsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHN1YnN0X21hcCB7CisJCWNoYXIgKm5hbWU7CisJCWNoYXIgZm10OworCQllbnVtIHN1YnN0X3R5cGUgdHlwZTsKKwl9IG1hcFtdID0geworCQl7IC5uYW1lID0gImNhcmRpbmZvIiwJLmZtdCA9ICdpJywJLnR5cGUgPSBTVUJTVF9DQVJESU5GTyB9LAorCQl7IC5uYW1lID0gImN0bCIsCS5mbXQgPSAnQycsCS50eXBlID0gU1VCU1RfQ1RMIH0sCisJCXsgLm5hbWUgPSAicmVzdWx0IiwJLmZtdCA9ICdjJywJLnR5cGUgPSBTVUJTVF9SRVNVTFQgfSwKKwkJeyAubmFtZSA9ICJhdHRyIiwJLmZtdCA9ICdzJywJLnR5cGUgPSBTVUJTVF9BVFRSIH0sCisJCXsgLm5hbWUgPSAic3lzZnNyb290IiwJLmZtdCA9ICdyJywJLnR5cGUgPSBTVUJTVF9TWVNGU1JPT1QgfSwKKwkJeyAubmFtZSA9ICJlbnYiLAkuZm10ID0gJ0UnLAkudHlwZSA9IFNVQlNUX0VOViB9LAorCQl7IC5uYW1lID0gImNvbmZpZyIsCS5mbXQgPSAnZycsCS50eXBlID0gU1VCU1RfQ09ORklHIH0sCisJCXsgTlVMTCwgJ1wwJywgMCB9CisJfTsKKwllbnVtIHN1YnN0X3R5cGUgdHlwZTsKKwljb25zdCBzdHJ1Y3Qgc3Vic3RfbWFwICpzdWJzdDsKKworCWhlYWQgPSBzdHJpbmc7CisJd2hpbGUgKDEpIHsKKwkJbGVuID0gLTE7CisJCXdoaWxlIChoZWFkWzBdICE9ICdcMCcpIHsKKwkJCWlmIChoZWFkWzBdID09ICckJykgeworCQkJCS8qIHN1YnN0aXR1dGUgbmFtZWQgdmFyaWFibGUgKi8KKwkJCQlpZiAoaGVhZFsxXSA9PSAnXDAnKQorCQkJCQlicmVhazsKKwkJCQlpZiAoaGVhZFsxXSA9PSAnJCcpIHsKKwkJCQkJc3RybGNweSh0ZW1wLCBoZWFkKzIsIHNpemVvZih0ZW1wKSk7CisJCQkJCXN0cmxjcHkoaGVhZCsxLCB0ZW1wLCBtYXhzaXplKTsKKwkJCQkJaGVhZCsrOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaGVhZFswXSA9ICdcMCc7CisJCQkJZm9yIChzdWJzdCA9IG1hcDsgc3Vic3QtPm5hbWU7IHN1YnN0KyspIHsKKwkJCQkJaWYgKHN0cm5jYXNlY21wKCZoZWFkWzFdLCBzdWJzdC0+bmFtZSwgc3RybGVuKHN1YnN0LT5uYW1lKSkgPT0gMCkgeworCQkJCQkJdHlwZSA9IHN1YnN0LT50eXBlOworCQkJCQkJdGFpbCA9IGhlYWQgKyBzdHJsZW4oc3Vic3QtPm5hbWUpKzE7CisJCQkJCQlkYmcoIndpbGwgc3Vic3RpdHV0ZSBmb3JtYXQgbmFtZSAnJXMnIiwgc3Vic3QtPm5hbWUpOworCQkJCQkJZ290byBmb3VuZDsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAoaGVhZFswXSA9PSAnJScpIHsKKwkJCQkvKiBzdWJzdGl0dXRlIGZvcm1hdCBjaGFyICovCisJCQkJaWYgKGhlYWRbMV0gPT0gJ1wwJykKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGhlYWRbMV0gPT0gJyUnKSB7CisJCQkJCXN0cmxjcHkodGVtcCwgaGVhZCsyLCBzaXplb2YodGVtcCkpOworCQkJCQlzdHJsY3B5KGhlYWQrMSwgdGVtcCwgbWF4c2l6ZSk7CisJCQkJCWhlYWQrKzsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWhlYWRbMF0gPSAnXDAnOworCQkJCXRhaWwgPSBoZWFkKzE7CisJCQkJbGVuID0gZ2V0X2Zvcm1hdF9sZW4oc3BhY2UsICZ0YWlsKTsKKwkJCQlmb3IgKHN1YnN0ID0gbWFwOyBzdWJzdC0+bmFtZTsgc3Vic3QrKykgeworCQkJCQlpZiAodGFpbFswXSA9PSBzdWJzdC0+Zm10KSB7CisJCQkJCQl0eXBlID0gc3Vic3QtPnR5cGU7CisJCQkJCQl0YWlsKys7CisJCQkJCQlkYmcoIndpbGwgc3Vic3RpdHV0ZSBmb3JtYXQgY2hhciAnJWMnIiwgc3Vic3QtPmZtdCk7CisJCQkJCQlnb3RvIGZvdW5kOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaGVhZCsrOworCQl9CisJCWJyZWFrOworZm91bmQ6CisJCWF0dHIgPSBnZXRfZm9ybWF0X2F0dHJpYnV0ZShzcGFjZSwgJnRhaWwpOworCQlzdHJsY3B5KHRlbXAsIHRhaWwsIHNpemVvZih0ZW1wKSk7CisJCWRiZygiZm9ybWF0PSVpLCBzdHJpbmc9JyVzJywgdGFpbD0nJXMnIiwgdHlwZSAsc3RyaW5nLCB0YWlsKTsKKworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBTVUJTVF9DQVJESU5GTzoKKwkJCWlmIChhdHRyID09IE5VTEwpCisJCQkJUGVycm9yKHNwYWNlLCAibWlzc2luZyBpZGVudGlmaWNhdGlvbiBwYXJhbWV0ciBmb3IgY2FyZGluZm8iKTsKKwkJCWVsc2UgeworCQkJCWNvbnN0IGNoYXIgKnZhbHVlID0gY2FyZGluZm9fZ2V0KHNwYWNlLCBhdHRyKTsKKwkJCQlpZiAodmFsdWUgPT0gTlVMTCkKKwkJCQkJYnJlYWs7CisJCQkJc3RybGNhdChzdHJpbmcsIHZhbHVlLCBtYXhzaXplKTsKKwkJCQlkYmcoInN1YnN0aXR1dGUgY2FyZGluZm97JXN9ICclcyciLCBhdHRyLCB2YWx1ZSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTVUJTVF9DVEw6CisJCQlpZiAoYXR0ciA9PSBOVUxMKQorCQkJCVBlcnJvcihzcGFjZSwgIm1pc3NpbmcgaWRlbnRpZmljYXRpb24gcGFyYW1ldHIgZm9yIGN0bCIpOworCQkJZWxzZSB7CisJCQkJY29uc3QgY2hhciAqdmFsdWUgPSBlbGVtaWRfZ2V0KHNwYWNlLCBhdHRyKTsKKwkJCQlpZiAodmFsdWUgPT0gTlVMTCkKKwkJCQkJYnJlYWs7CisJCQkJc3RybGNhdChzdHJpbmcsIHZhbHVlLCBtYXhzaXplKTsKKwkJCQlkYmcoInN1YnN0aXR1dGUgY3RseyVzfSAnJXMnIiwgYXR0ciwgdmFsdWUpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU1VCU1RfUkVTVUxUOgorCQkJaWYgKHNwYWNlLT5wcm9ncmFtX3Jlc3VsdCA9PSBOVUxMKQorCQkJCWJyZWFrOworCQkJLyogZ2V0IHBhcnQgcGFydCBvZiB0aGUgcmVzdWx0IHN0cmluZyAqLworCQkJaSA9IDA7CisJCQlpZiAoYXR0ciAhPSBOVUxMKQorCQkJCWkgPSBzdHJ0b3VsKGF0dHIsICZyZXN0LCAxMCk7CisJCQlpZiAoaSA+IDApIHsKKwkJCQlkYmcoInJlcXVlc3QgcGFydCAjJWQgb2YgcmVzdWx0IHN0cmluZyIsIGkpOworCQkJCWNwb3MgPSBzcGFjZS0+cHJvZ3JhbV9yZXN1bHQ7CisJCQkJd2hpbGUgKC0taSkgeworCQkJCQl3aGlsZSAoY3Bvc1swXSAhPSAnXDAnICYmICFpc3NwYWNlKGNwb3NbMF0pKQorCQkJCQkJY3BvcysrOworCQkJCQl3aGlsZSAoaXNzcGFjZShjcG9zWzBdKSkKKwkJCQkJCWNwb3MrKzsKKwkJCQl9CisJCQkJaWYgKGkgPiAwKSB7CisJCQkJCVBlcnJvcihzcGFjZSwgInJlcXVlc3RlZCBwYXJ0IG9mIHJlc3VsdCBzdHJpbmcgbm90IGZvdW5kIik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlzdHJsY3B5KHRlbXAyLCBjcG9zLCBzaXplb2YodGVtcDIpKTsKKwkJCQkvKiAlezIrfWMgY29waWVzIHRoZSB3aG9sZSBzdHJpbmcgZnJvbSB0aGUgc2Vjb25kIHBhcnQgb24gKi8KKwkJCQlpZiAocmVzdFswXSAhPSAnKycpIHsKKwkJCQkJY3BvcyA9IHN0cmNocih0ZW1wMiwgJyAnKTsKKwkJCQkJaWYgKGNwb3MpCisJCQkJCQljcG9zWzBdID0gJ1wwJzsKKwkJCQl9CisJCQkJc3RybGNhdChzdHJpbmcsIHRlbXAyLCBtYXhzaXplKTsKKwkJCQlkYmcoInN1YnN0aXR1dGUgcGFydCBvZiByZXN1bHQgc3RyaW5nICclcyciLCB0ZW1wMik7CisJCQl9IGVsc2UgeworCQkJCXN0cmxjYXQoc3RyaW5nLCBzcGFjZS0+cHJvZ3JhbV9yZXN1bHQsIG1heHNpemUpOworCQkJCWRiZygic3Vic3RpdHV0ZSByZXN1bHQgc3RyaW5nICclcyciLCBzcGFjZS0+cHJvZ3JhbV9yZXN1bHQpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU1VCU1RfQVRUUjoKKwkJCWlmIChhdHRyID09IE5VTEwpCisJCQkJUGVycm9yKHNwYWNlLCAibWlzc2luZyBmaWxlIHBhcmFtZXRlciBmb3IgYXR0ciIpOworCQkJZWxzZSB7CisJCQkJY29uc3QgY2hhciAqdmFsdWUgPSBOVUxMOworCQkJCXNpemVfdCBzaXplOworCisJCQkJcGFpciA9IHZhbHVlX2ZpbmQoc3BhY2UsICJzeXNmc19kZXZpY2UiKTsKKwkJCQlpZiAocGFpciA9PSBOVUxMKQorCQkJCQlicmVhazsKKwkJCQl2YWx1ZSA9IHN5c2ZzX2F0dHJfZ2V0X3ZhbHVlKHBhaXItPnZhbHVlLCBhdHRyKTsKKworCQkJCWlmICh2YWx1ZSA9PSBOVUxMKQorCQkJCQlicmVhazsKKworCQkJCS8qIHN0cmlwIHRyYWlsaW5nIHdoaXRlc3BhY2UgYW5kIHJlcGxhY2UgdW50cnVzdGVkIGNoYXJhY3RlcnMgb2Ygc3lzZnMgdmFsdWUgKi8KKwkJCQlzaXplID0gc3RybGNweSh0ZW1wMiwgdmFsdWUsIHNpemVvZih0ZW1wMikpOworCQkJCWlmIChzaXplID49IHNpemVvZih0ZW1wMikpCisJCQkJCXNpemUgPSBzaXplb2YodGVtcDIpLTE7CisJCQkJd2hpbGUgKHNpemUgPiAwICYmIGlzc3BhY2UodGVtcDJbc2l6ZS0xXSkpCisJCQkJCXRlbXAyWy0tc2l6ZV0gPSAnXDAnOworCQkJCWNvdW50ID0gcmVwbGFjZV91bnRydXN0ZWRfY2hhcnModGVtcDIpOworCQkJCWlmIChjb3VudCA+IDApCisJCQkJCVBlcnJvcihzcGFjZSwgIiVpIHVudHJ1c3RlZCBjaGFyYWN0ZXIocykgcmVwbGFjZWQiICwgY291bnQpOworCQkJCXN0cmxjYXQoc3RyaW5nLCB0ZW1wMiwgbWF4c2l6ZSk7CisJCQkJZGJnKCJzdWJzdGl0dXRlIHN5c2ZzIHZhbHVlICclcyciLCB0ZW1wMik7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTVUJTVF9TWVNGU1JPT1Q6CisJCQlzdHJsY2F0KHN0cmluZywgc3lzZnNfcGF0aCwgbWF4c2l6ZSk7CisJCQlkYmcoInN1YnN0aXR1dGUgc3lzZnNfcGF0aCAnJXMnIiwgc3lzZnNfcGF0aCk7CisJCQlicmVhazsKKwkJY2FzZSBTVUJTVF9FTlY6CisJCQlpZiAoYXR0ciA9PSBOVUxMKSB7CisJCQkJZGJnKCJtaXNzaW5nIGF0dHJpYnV0ZSIpOworCQkJCWJyZWFrOworCQkJfQorCQkJcG9zID0gZ2V0ZW52KGF0dHIpOworCQkJaWYgKHBvcyA9PSBOVUxMKSB7CisJCQkJZGJnKCJlbnYgJyVzJyBub3QgYXZhaWxhYmxlIiwgYXR0cik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkYmcoInN1YnN0aXR1dGUgZW52ICclcz0lcyciLCBhdHRyLCBwb3MpOworCQkJc3RybGNhdChzdHJpbmcsIHBvcywgbWF4c2l6ZSk7CisJCQlicmVhazsKKwkJY2FzZSBTVUJTVF9DT05GSUc6CisJCQlpZiAoYXR0ciA9PSBOVUxMKSB7CisJCQkJZGJnKCJtaXNzaW5nIGF0dHJpYnV0ZSIpOworCQkJCWJyZWFrOworCQkJfQorCQkJcGFpciA9IHZhbHVlX2ZpbmQoc3BhY2UsIGF0dHIpOworCQkJaWYgKHBhaXIgPT0gTlVMTCkKKwkJCQlicmVhazsKKwkJCXN0cmxjYXQoc3RyaW5nLCBwYWlyLT52YWx1ZSwgbWF4c2l6ZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVBlcnJvcihzcGFjZSwgInVua25vd24gc3Vic3RpdHV0aW9uIHR5cGU9JWkiLCB0eXBlKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIHBvc3NpYmx5IHRydW5jYXRlIHRvIGZvcm1hdC1jaGFyIHNwZWNpZmllZCBsZW5ndGggKi8KKwkJaWYgKGxlbiAhPSAtMSkgeworCQkJaGVhZFtsZW5dID0gJ1wwJzsKKwkJCWRiZygidHJ1bmNhdGUgdG8gJWkgY2hhcnMsIHN1YnRpdHV0aW9uIHN0cmluZyBiZWNvbWVzICclcyciLCBsZW4sIGhlYWQpOworCQl9CisJCXN0cmxjYXQoc3RyaW5nLCB0ZW1wLCBtYXhzaXplKTsKKwl9CisJLyogdW5lc2NhcGUgc3RyaW5ncyAqLworCWhlYWQgPSB0YWlsID0gc3RyaW5nOworCXdoaWxlICgqaGVhZCAhPSAnXDAnKSB7CisJCWlmICgqaGVhZCA9PSAnXFwnKSB7CisJCQloZWFkKys7CisJCQlpZiAoKmhlYWQgPT0gJ1wwJykKKwkJCQlicmVhazsKKwkJCXN3aXRjaCAoKmhlYWQpIHsKKwkJCWNhc2UgJ2EnOiAqdGFpbCsrID0gJ1xhJzsgYnJlYWs7CisJCQljYXNlICdiJzogKnRhaWwrKyA9ICdcYic7IGJyZWFrOworCQkJY2FzZSAnbic6ICp0YWlsKysgPSAnXG4nOyBicmVhazsKKwkJCWNhc2UgJ3InOiAqdGFpbCsrID0gJ1xyJzsgYnJlYWs7CisJCQljYXNlICd0JzogKnRhaWwrKyA9ICdcdCc7IGJyZWFrOworCQkJY2FzZSAndic6ICp0YWlsKysgPSAnXHYnOyBicmVhazsKKwkJCWNhc2UgJ1xcJzogKnRhaWwrKyA9ICdcXCc7IGJyZWFrOworCQkJZGVmYXVsdDogKnRhaWwrKyA9ICpoZWFkOyBicmVhazsKKwkJCX0KKwkJCWhlYWQrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgqaGVhZCkKKwkJCSp0YWlsKysgPSAqaGVhZCsrOworCX0KKwkqdGFpbCA9IDA7Cit9CisKK3N0YXRpYworaW50IHJ1bl9wcm9ncmFtMShzdHJ1Y3Qgc3BhY2UgKnNwYWNlLAorCQkgY29uc3QgY2hhciAqY29tbWFuZDAsIGNoYXIgKnJlc3VsdCwKKwkJIHNpemVfdCByZXNzaXplLCBzaXplX3QgKnJlc2xlbiwgaW50IGxvZykKK3sKKwlpZiAoc3RybmNtcChjb21tYW5kMCwgIl9fY3RsX3NlYXJjaCIsIDEyKSA9PSAwKSB7CisJCWNvbnN0IGNoYXIgKnJlcyA9IGVsZW1pZF9nZXQoc3BhY2UsICJkb19zZWFyY2giKTsKKwkJaWYgKHJlcyA9PSBOVUxMIHx8IHN0cmNtcChyZXMsICIxIikgIT0gMCkKKwkJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCWlmIChzdHJuY21wKGNvbW1hbmQwLCAiX19jdGxfY291bnQiLCAxMSkgPT0gMCkgeworCQljb25zdCBjaGFyICpyZXMgPSBlbGVtaWRfZ2V0KHNwYWNlLCAiZG9fY291bnQiKTsKKwkJaWYgKHJlcyA9PSBOVUxMIHx8IHN0cmNtcChyZXMsICIwIikgPT0gMCkKKwkJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJCXN0cmxjcHkocmVzdWx0LCByZXMsIHJlc3NpemUpOworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKwlQZXJyb3Ioc3BhY2UsICJ1bmtub3duIGJ1aWxkaW4gY29tbWFuZCAnJXMnIiwgY29tbWFuZDApOworCXJldHVybiBFWElUX0ZBSUxVUkU7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Uoc3RydWN0IHNwYWNlICpzcGFjZSwgY29uc3QgY2hhciAqZmlsZW5hbWUpOworCitzdGF0aWMgY2hhciAqbmV3X3Jvb3RfZGlyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWNoYXIgKnJlcywgKnRtcDsKKworCXJlcyA9IHN0cmR1cChmaWxlbmFtZSk7CisJaWYgKHJlcykgeworCQl0bXAgPSBzdHJyY2hyKHJlcywgJy8nKTsKKwkJaWYgKHRtcCkKKwkJCSp0bXAgPSAnXDAnOworCX0KKwlkYmcoIm5ld19yb290X2RpciAnJXMnICclcyciLCBmaWxlbmFtZSwgcmVzKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IHBhcnNlX2xpbmUoc3RydWN0IHNwYWNlICpzcGFjZSwgY2hhciAqbGluZSwgc2l6ZV90IGxpbmVzaXplKQoreworCWNoYXIgKmxpbmVwb3M7CisJY2hhciAqa2V5LCAqdmFsdWUsICphdHRyLCAqdGVtcDsKKwlzdHJ1Y3QgcGFpciAqcGFpcjsKKwllbnVtIGtleV9vcCBvcDsKKwlpbnQgZXJyID0gMCwgY291bnQ7CisJY2hhciBzdHJpbmdbUEFUSF9TSVpFXTsKKwljaGFyIHJlc3VsdFtQQVRIX1NJWkVdOworCisJbGluZXBvcyA9IGxpbmU7CisJd2hpbGUgKCpsaW5lcG9zICE9ICdcMCcpIHsKKwkJb3AgPSBLRVlfT1BfVU5TRVQ7CisJCQorCQllcnIgPSBnZXRfa2V5KCZsaW5lcG9zLCAma2V5LCAmb3AsICZ2YWx1ZSk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBpbnZhbGlkOworCisJCWlmIChzdHJuY2FzZWNtcChrZXksICJMQUJFTCIsIDUpID09IDApIHsKKwkJCWlmIChvcCAhPSBLRVlfT1BfQVNTSUdOKSB7CisJCQkJUGVycm9yKHNwYWNlLCAiaW52YWxpZCBMQUJFTCBvcGVyYXRpb24iKTsKKwkJCQlnb3RvIGludmFsaWQ7CisJCQl9CisJCQlpZiAoc3BhY2UtPmdvX3RvICYmIHN0cmNtcChzcGFjZS0+Z29fdG8sIHZhbHVlKSA9PSAwKSB7CisJCQkJZnJlZShzcGFjZS0+Z29fdG8pOworCQkJCXNwYWNlLT5nb190byA9IE5VTEw7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQkKKwkJaWYgKHNwYWNlLT5nb190bykgeworCQkJZGJnKCJza2lwIChHT1RPICclcycpIiwgc3BhY2UtPmdvX3RvKTsKKwkJCWJyZWFrOwkJLyogbm90IGZvciB1cyAqLworCQl9CisKKwkJaWYgKHN0cm5jYXNlY21wKGtleSwgIkNUTHsiLCA0KSA9PSAwKSB7CisJCQlhdHRyID0gZ2V0X2tleV9hdHRyaWJ1dGUoc3BhY2UsIGtleSArIDMsIHN0cmluZywgc2l6ZW9mKHN0cmluZykpOworCQkJaWYgKGF0dHIgPT0gTlVMTCkgeworCQkJCVBlcnJvcihzcGFjZSwgImVycm9yIHBhcnNpbmcgQ1RMIGF0dHJpYnV0ZSIpOworCQkJCWdvdG8gaW52YWxpZDsKKwkJCX0KKwkJCWlmIChvcCA9PSBLRVlfT1BfQVNTSUdOKSB7CisJCQkJc3RybGNweShyZXN1bHQsIHZhbHVlLCBzaXplb2YocmVzdWx0KSk7CisJCQkJYXBwbHlfZm9ybWF0KHNwYWNlLCByZXN1bHQsIHNpemVvZihyZXN1bHQpKTsKKwkJCQlkYmcoImN0bCBhc3NpZ246ICclcycgJyVzJyIsIHZhbHVlLCBhdHRyKTsKKwkJCQllcnIgPSBlbGVtaWRfc2V0KHNwYWNlLCBhdHRyLCByZXN1bHQpOworCQkJCWlmIChzcGFjZS0+cHJvZ3JhbV9yZXN1bHQpIHsKKwkJCQkJZnJlZShzcGFjZS0+cHJvZ3JhbV9yZXN1bHQpOworCQkJCQlzcGFjZS0+cHJvZ3JhbV9yZXN1bHQgPSBOVUxMOworCQkJCX0KKwkJCQlzbnByaW50ZihzdHJpbmcsIHNpemVvZihzdHJpbmcpLCAiJWkiLCBlcnIpOworCQkJCXNwYWNlLT5wcm9ncmFtX3Jlc3VsdCA9IHN0cmR1cChzdHJpbmcpOworCQkJCWVyciA9IDA7CisJCQkJaWYgKHNwYWNlLT5wcm9ncmFtX3Jlc3VsdCA9PSBOVUxMKQorCQkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAob3AgPT0gS0VZX09QX01BVENIIHx8IG9wID09IEtFWV9PUF9OT01BVENIKSB7CisJCQkJaWYgKHN0cm5jbXAoYXR0ciwgIndyaXRlIiwgNSkgPT0gMCkgeworCQkJCQlzdHJsY3B5KHJlc3VsdCwgdmFsdWUsIHNpemVvZihyZXN1bHQpKTsKKwkJCQkJYXBwbHlfZm9ybWF0KHNwYWNlLCByZXN1bHQsIHNpemVvZihyZXN1bHQpKTsKKwkJCQkJZGJnKCJjdGwgd3JpdGU6ICclcycgJyVzJyIsIHZhbHVlLCBhdHRyKTsKKwkJCQkJZXJyID0gZWxlbWlkX3NldChzcGFjZSwgInZhbHVlcyIsIHJlc3VsdCk7CisJCQkJCWlmIChlcnIgPT0gMCAmJiBvcCA9PSBLRVlfT1BfTk9NQVRDSCkKKwkJCQkJCWJyZWFrOworCQkJCQlpZiAoZXJyICE9IDAgJiYgb3AgPT0gS0VZX09QX01BVENIKQorCQkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIHsKKwkJCQkJdGVtcCA9IChjaGFyICopZWxlbWlkX2dldChzcGFjZSwgYXR0cik7CisJCQkJCWRiZygiY3RsIG1hdGNoOiAnJXMnICclcycgJyVzJyIsIGF0dHIsIHZhbHVlLCB0ZW1wKTsKKwkJCQkJaWYgKCFkb19tYXRjaChrZXksIG9wLCB2YWx1ZSwgdGVtcCkpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCVBlcnJvcihzcGFjZSwgImludmFsaWQgQ1RMe30gb3BlcmF0aW9uIik7CisJCQkJZ290byBpbnZhbGlkOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKHN0cmNhc2VjbXAoa2V5LCAiUkVTVUxUIikgPT0gMCkgeworCQkJaWYgKG9wID09IEtFWV9PUF9NQVRDSCB8fCBvcCA9PSBLRVlfT1BfTk9NQVRDSCkgeworCQkJCWlmICghZG9fbWF0Y2goa2V5LCBvcCwgdmFsdWUsIHNwYWNlLT5wcm9ncmFtX3Jlc3VsdCkpCisJCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChvcCA9PSBLRVlfT1BfQVNTSUdOKSB7CisJCQkJaWYgKHNwYWNlLT5wcm9ncmFtX3Jlc3VsdCkgeworCQkJCQlmcmVlKHNwYWNlLT5wcm9ncmFtX3Jlc3VsdCk7CisJCQkJCXNwYWNlLT5wcm9ncmFtX3Jlc3VsdCA9IE5VTEw7CisJCQkJfQorCQkJCXN0cmxjcHkoc3RyaW5nLCB2YWx1ZSwgc2l6ZW9mKHN0cmluZykpOworCQkJCWFwcGx5X2Zvcm1hdChzcGFjZSwgc3RyaW5nLCBzaXplb2Yoc3RyaW5nKSk7CisJCQkJc3BhY2UtPnByb2dyYW1fcmVzdWx0ID0gc3RyZHVwKHN0cmluZyk7CisJCQkJaWYgKHNwYWNlLT5wcm9ncmFtX3Jlc3VsdCA9PSBOVUxMKQorCQkJCQlicmVhazsKKyAJCQl9IGVsc2UgeworCQkJCVBlcnJvcihzcGFjZSwgImludmFsaWQgUkVTVUxUIG9wZXJhdGlvbiIpOworCQkJCWdvdG8gaW52YWxpZDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzdHJjYXNlY21wKGtleSwgIlBST0dSQU0iKSA9PSAwKSB7CisJCQlpZiAob3AgPT0gS0VZX09QX1VOU0VUKQorCQkJCWNvbnRpbnVlOworCQkJc3RybGNweShzdHJpbmcsIHZhbHVlLCBzaXplb2Yoc3RyaW5nKSk7CisJCQlhcHBseV9mb3JtYXQoc3BhY2UsIHN0cmluZywgc2l6ZW9mKHN0cmluZykpOworCQkJaWYgKHNwYWNlLT5wcm9ncmFtX3Jlc3VsdCkgeworCQkJCWZyZWUoc3BhY2UtPnByb2dyYW1fcmVzdWx0KTsKKwkJCQlzcGFjZS0+cHJvZ3JhbV9yZXN1bHQgPSBOVUxMOworCQkJfQorCQkJaWYgKHJ1bl9wcm9ncmFtKHNwYWNlLCBzdHJpbmcsIHJlc3VsdCwgc2l6ZW9mKHJlc3VsdCksIE5VTEwsIHNwYWNlLT5sb2dfcnVuKSAhPSAwKSB7CisJCQkJZGJnKCJQUk9HUkFNICclcycgaXMgZmFsc2UiLCBzdHJpbmcpOworCQkJCWlmIChvcCAhPSBLRVlfT1BfTk9NQVRDSCkKKwkJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCXJlbW92ZV90cmFpbGluZ19jaGFycyhyZXN1bHQsICdcbicpOworCQkJCWNvdW50ID0gcmVwbGFjZV91bnRydXN0ZWRfY2hhcnMocmVzdWx0KTsKKwkJCQlpZiAoY291bnQpCisJCQkJCWluZm8oIiVpIHVudHJ1c3RlZCBjaGFyYWN0ZXIocykgcmVwbGFjZWQiLCBjb3VudCk7CisJCQkJZGJnKCJQUk9HUkFNICclcycgcmVzdWx0IGlzICclcyciLCBzdHJpbmcsIHJlc3VsdCk7CisJCQkJc3BhY2UtPnByb2dyYW1fcmVzdWx0ID0gc3RyZHVwKHJlc3VsdCk7CisJCQkJaWYgKHNwYWNlLT5wcm9ncmFtX3Jlc3VsdCA9PSBOVUxMKQorCQkJCQlicmVhazsKKwkJCQlkYmcoIlBST0dSQU0gcmV0dXJuZWQgc3VjY2Vzc2Z1bCIpOworCQkJCWlmIChvcCA9PSBLRVlfT1BfTk9NQVRDSCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlkYmcoIlBST0dSQU0ga2V5IGlzIHRydWUiKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzdHJuY2FzZWNtcChrZXksICJDQVJESU5GT3siLCA5KSA9PSAwKSB7CisJCQlhdHRyID0gZ2V0X2tleV9hdHRyaWJ1dGUoc3BhY2UsIGtleSArIDgsIHN0cmluZywgc2l6ZW9mKHN0cmluZykpOworCQkJaWYgKGF0dHIgPT0gTlVMTCkgeworCQkJCVBlcnJvcihzcGFjZSwgImVycm9yIHBhcnNpbmcgQ0FSRElORk8gYXR0cmlidXRlIik7CisJCQkJZ290byBpbnZhbGlkOworCQkJfQorCQkJaWYgKG9wID09IEtFWV9PUF9NQVRDSCB8fCBvcCA9PSBLRVlfT1BfTk9NQVRDSCkgeworCQkJCWRiZygiY2FyZGluZm86ICclcycgJyVzJyIsIHZhbHVlLCBhdHRyKTsKKwkJCQl0ZW1wID0gKGNoYXIgKiljYXJkaW5mb19nZXQoc3BhY2UsIGF0dHIpOworCQkJCWlmICghZG9fbWF0Y2goa2V5LCBvcCwgdmFsdWUsIHRlbXApKQorCQkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJUGVycm9yKHNwYWNlLCAiaW52YWxpZCBDQVJESU5GT3t9IG9wZXJhdGlvbiIpOworCQkJCWdvdG8gaW52YWxpZDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzdHJuY2FzZWNtcChrZXksICJBVFRSeyIsIDUpID09IDApIHsKKwkJCWF0dHIgPSBnZXRfa2V5X2F0dHJpYnV0ZShzcGFjZSwga2V5ICsgNCwgc3RyaW5nLCBzaXplb2Yoc3RyaW5nKSk7CisJCQlpZiAoYXR0ciA9PSBOVUxMKSB7CisJCQkJUGVycm9yKHNwYWNlLCAiZXJyb3IgcGFyc2luZyBBVFRSIGF0dHJpYnV0ZSIpOworCQkJCWdvdG8gaW52YWxpZDsKKwkJCX0KKwkJCWlmIChvcCA9PSBLRVlfT1BfTUFUQ0ggfHwgb3AgPT0gS0VZX09QX05PTUFUQ0gpIHsKKwkJCQlwYWlyID0gdmFsdWVfZmluZChzcGFjZSwgInN5c2ZzX2RldmljZSIpOworCQkJCWlmIChwYWlyID09IE5VTEwpCisJCQkJCWJyZWFrOworCQkJCWRiZygic3lzZnNfYXR0cjogJyVzJyAnJXMnIiwgcGFpci0+dmFsdWUsIGF0dHIpOworCQkJCXRlbXAgPSBzeXNmc19hdHRyX2dldF92YWx1ZShwYWlyLT52YWx1ZSwgYXR0cik7CisJCQkJaWYgKCFkb19tYXRjaChrZXksIG9wLCB2YWx1ZSwgdGVtcCkpCisJCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlQZXJyb3Ioc3BhY2UsICJpbnZhbGlkIEFUVFJ7fSBvcGVyYXRpb24iKTsKKwkJCQlnb3RvIGludmFsaWQ7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3RybmNhc2VjbXAoa2V5LCAiRU5WeyIsIDQpID09IDApIHsKKwkJCWF0dHIgPSBnZXRfa2V5X2F0dHJpYnV0ZShzcGFjZSwga2V5ICsgMywgc3RyaW5nLCBzaXplb2Yoc3RyaW5nKSk7CisJCQlpZiAoYXR0ciA9PSBOVUxMKSB7CisJCQkJUGVycm9yKHNwYWNlLCAiZXJyb3IgcGFyc2luZyBFTlYgYXR0cmlidXRlIik7CisJCQkJZ290byBpbnZhbGlkOworCQkJfQorCQkJaWYgKG9wID09IEtFWV9PUF9NQVRDSCB8fCBvcCA9PSBLRVlfT1BfTk9NQVRDSCkgeworCQkJCXRlbXAgPSBnZXRlbnYoYXR0cik7CisJCQkJZGJnKCJlbnY6ICclcycgJyVzJyIsIGF0dHIsIHRlbXApOworCQkJCWlmICghZG9fbWF0Y2goa2V5LCBvcCwgdmFsdWUsIHRlbXApKQorCQkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAob3AgPT0gS0VZX09QX0FTU0lHTiB8fAorCQkJCSAgIG9wID09IEtFWV9PUF9BU1NJR05fRklOQUwpIHsKKwkJCQlzdHJsY3B5KHJlc3VsdCwgdmFsdWUsIHNpemVvZihyZXN1bHQpKTsKKwkJCQlhcHBseV9mb3JtYXQoc3BhY2UsIHJlc3VsdCwgc2l6ZW9mKHJlc3VsdCkpOworCQkJCWRiZygiZW52IHNldDogJyVzJyAnJXMnIiwgYXR0ciwgcmVzdWx0KTsKKwkJCQlpZiAoc2V0ZW52KGF0dHIsIHJlc3VsdCwgb3AgPT0gS0VZX09QX0FTU0lHTl9GSU5BTCkpCisJCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlQZXJyb3Ioc3BhY2UsICJpbnZhbGlkIEVOVnt9IG9wZXJhdGlvbiIpOworCQkJCWdvdG8gaW52YWxpZDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzdHJjYXNlY21wKGtleSwgIkdPVE8iKSA9PSAwKSB7CisJCQlpZiAob3AgIT0gS0VZX09QX0FTU0lHTikgeworCQkJCVBlcnJvcihzcGFjZSwgImludmFsaWQgR09UTyBvcGVyYXRpb24iKTsKKwkJCQlnb3RvIGludmFsaWQ7CisJCQl9CisJCQlzcGFjZS0+Z29fdG8gPSBzdHJkdXAodmFsdWUpOworCQkJaWYgKHNwYWNlLT5nb190byA9PSBOVUxMKSB7CisJCQkJZXJyID0gLUVOT01FTTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzdHJjYXNlY21wKGtleSwgIklOQ0xVREUiKSA9PSAwKSB7CisJCQljaGFyICpyb290ZGlyLCAqZ29fdG87CisJCQljb25zdCBjaGFyICpmaWxlbmFtZTsKKwkJCXN0cnVjdCBkaXJlbnQgKmRpcmVudDsKKwkJCURJUiAqZGlyOworCQkJaW50IGxpbmVudW07CisJCQlpZiAob3AgIT0gS0VZX09QX0FTU0lHTikgeworCQkJCVBlcnJvcihzcGFjZSwgImludmFsaWQgSU5DTFVERSBvcGVyYXRpb24iKTsKKwkJCQlnb3RvIGludmFsaWQ7CisJCQl9CisJCQlpZiAodmFsdWVbMF0gPT0gJy8nKQorCQkJCXN0cmxjcHkoc3RyaW5nLCB2YWx1ZSwgc2l6ZW9mKHN0cmluZykpOworCQkJZWxzZSB7CisJCQkJc3RybGNweShzdHJpbmcsIHNwYWNlLT5yb290ZGlyLCBzaXplb2Yoc3RyaW5nKSk7CisJCQkJc3RybGNhdChzdHJpbmcsICIvIiwgc2l6ZW9mKHN0cmluZykpOworCQkJCXN0cmxjYXQoc3RyaW5nLCB2YWx1ZSwgc2l6ZW9mKHN0cmluZykpOworCQkJfQorCQkJcm9vdGRpciA9IHNwYWNlLT5yb290ZGlyOworCQkJZ29fdG8gPSBzcGFjZS0+Z29fdG87CisJCQlmaWxlbmFtZSA9IHNwYWNlLT5maWxlbmFtZTsKKwkJCWxpbmVudW0gPSBzcGFjZS0+bGluZW51bTsKKwkJCWRpciA9IG9wZW5kaXIoc3RyaW5nKTsKKwkJCWlmIChkaXIpIHsKKwkJCQljb3VudCA9IHN0cmxlbihzdHJpbmcpOworCQkJCXdoaWxlICgoZGlyZW50ID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCQkJCWlmIChzdHJjbXAoZGlyZW50LT5kX25hbWUsICIuIikgPT0gMCB8fAorCQkJCQkgICAgc3RyY21wKGRpcmVudC0+ZF9uYW1lLCAiLi4iKSA9PSAwKQorCQkJCQkJY29udGludWU7CisJCQkJCXN0cmluZ1tjb3VudF0gPSAnXDAnOworCQkJCQlzdHJsY2F0KHN0cmluZywgIi8iLCBzaXplb2Yoc3RyaW5nKSk7CisJCQkJCXN0cmxjYXQoc3RyaW5nLCBkaXJlbnQtPmRfbmFtZSwgc2l6ZW9mKHN0cmluZykpOworCQkJCQlzcGFjZS0+Z29fdG8gPSBOVUxMOworCQkJCQlzcGFjZS0+cm9vdGRpciA9IG5ld19yb290X2RpcihzdHJpbmcpOworCQkJCQlpZiAoc3BhY2UtPnJvb3RkaXIpIHsKKwkJCQkJCWVyciA9IHBhcnNlKHNwYWNlLCBzdHJpbmcpOworCQkJCQkJZnJlZShzcGFjZS0+cm9vdGRpcik7CisJCQkJCX0gZWxzZQorCQkJCQkJZXJyID0gLUVOT01FTTsKKwkJCQkJaWYgKHNwYWNlLT5nb190bykgeworCQkJCQkJUGVycm9yKHNwYWNlLCAidW50ZXJtaW5hdGVkIEdPVE8gJyVzJyIsIHNwYWNlLT5nb190byk7CisJCQkJCQlmcmVlKHNwYWNlLT5nb190byk7CisJCQkJCX0KKwkJCQkJaWYgKGVycikKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljbG9zZWRpcihkaXIpOworCQkJfSBlbHNlIHsKKwkJCQlzcGFjZS0+Z29fdG8gPSBOVUxMOworCQkJCXNwYWNlLT5yb290ZGlyID0gbmV3X3Jvb3RfZGlyKHN0cmluZyk7CisJCQkJaWYgKHNwYWNlLT5yb290ZGlyKSB7CisJCQkJCWVyciA9IHBhcnNlKHNwYWNlLCBzdHJpbmcpOworCQkJCQlmcmVlKHNwYWNlLT5yb290ZGlyKTsKKwkJCQl9IGVsc2UKKwkJCQkJZXJyID0gLUVOT01FTTsKKwkJCQlpZiAoc3BhY2UtPmdvX3RvKSB7CisJCQkJCVBlcnJvcihzcGFjZSwgInVudGVybWluYXRlZCBHT1RPICclcyciLCBzcGFjZS0+Z29fdG8pOworCQkJCQlmcmVlKHNwYWNlLT5nb190byk7CisJCQkJfQorCQkJfQorCQkJc3BhY2UtPmdvX3RvID0gZ29fdG87CisJCQlzcGFjZS0+cm9vdGRpciA9IHJvb3RkaXI7CisJCQlzcGFjZS0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKKwkJCXNwYWNlLT5saW5lbnVtID0gbGluZW51bTsKKwkJCWlmIChzcGFjZS0+cXVpdCkKKwkJCQlicmVhazsKKwkJCWlmIChlcnIpCisJCQkJYnJlYWs7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3RybmNhc2VjbXAoa2V5LCAiQUNDRVNTIiwgNikgPT0gMCkgeworCQkJaWYgKG9wID09IEtFWV9PUF9NQVRDSCB8fCBvcCA9PSBLRVlfT1BfTk9NQVRDSCkgeworCQkJCWlmICh2YWx1ZVswXSA9PSAnJCcpIHsKKwkJCQkJc3RybGNweShzdHJpbmcsIHZhbHVlLCBzaXplb2Yoc3RyaW5nKSk7CisJCQkJCWFwcGx5X2Zvcm1hdChzcGFjZSwgc3RyaW5nLCBzaXplb2Yoc3RyaW5nKSk7CisJCQkJCWlmIChzdHJpbmdbMF0gPT0gJy8nKQorCQkJCQkJZ290byBfX2FjY2VzczE7CisJCQkJfQorCQkJCWlmICh2YWx1ZVswXSAhPSAnLycpIHsKKwkJCQkJc3RybGNweShzdHJpbmcsIHNwYWNlLT5yb290ZGlyLCBzaXplb2Yoc3RyaW5nKSk7CisJCQkJCXN0cmxjYXQoc3RyaW5nLCAiLyIsIHNpemVvZihzdHJpbmcpKTsKKwkJCQkJc3RybGNhdChzdHJpbmcsIHZhbHVlLCBzaXplb2Yoc3RyaW5nKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc3RybGNweShzdHJpbmcsIHZhbHVlLCBzaXplb2Yoc3RyaW5nKSk7CisJCQkJfQorCQkJCWFwcGx5X2Zvcm1hdChzcGFjZSwgc3RyaW5nLCBzaXplb2Yoc3RyaW5nKSk7CisJCQkgICAgICBfX2FjY2VzczE6CisJCQkJY291bnQgPSBhY2Nlc3Moc3RyaW5nLCBGX09LKTsKKwkJCQlkYmcoImFjY2VzcyglcykgPSAlaSAoJXMpIiwgc3RyaW5nLCBjb3VudCwgdmFsdWUpOworCQkJCWlmIChvcCA9PSBLRVlfT1BfTUFUQ0ggJiYgY291bnQgIT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKG9wID09IEtFWV9PUF9OT01BVENIICYmIGNvdW50ID09IDApCisJCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlQZXJyb3Ioc3BhY2UsICJpbnZhbGlkIEFDQ0VTUyBvcGVyYXRpb24iKTsKKwkJCQlnb3RvIGludmFsaWQ7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3RybmNhc2VjbXAoa2V5LCAiUFJJTlQiLCA1KSA9PSAwKSB7CisJCQlpZiAob3AgIT0gS0VZX09QX0FTU0lHTikgeworCQkJCVBlcnJvcihzcGFjZSwgImludmFsaWQgUFJJTlQgb3BlcmF0aW9uIik7CisJCQkJZ290byBpbnZhbGlkOworCQkJfQorCQkJc3RybGNweShzdHJpbmcsIHZhbHVlLCBzaXplb2Yoc3RyaW5nKSk7CisJCQlhcHBseV9mb3JtYXQoc3BhY2UsIHN0cmluZywgc2l6ZW9mKHN0cmluZykpOworCQkJZndyaXRlKHN0cmluZywgc3RybGVuKHN0cmluZyksIDEsIHN0ZG91dCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3RybmNhc2VjbXAoa2V5LCAiRVJST1IiLCA1KSA9PSAwKSB7CisJCQlpZiAob3AgIT0gS0VZX09QX0FTU0lHTikgeworCQkJCVBlcnJvcihzcGFjZSwgImludmFsaWQgRVJST1Igb3BlcmF0aW9uIik7CisJCQkJZ290byBpbnZhbGlkOworCQkJfQorCQkJc3RybGNweShzdHJpbmcsIHZhbHVlLCBzaXplb2Yoc3RyaW5nKSk7CisJCQlhcHBseV9mb3JtYXQoc3BhY2UsIHN0cmluZywgc2l6ZW9mKHN0cmluZykpOworCQkJZndyaXRlKHN0cmluZywgc3RybGVuKHN0cmluZyksIDEsIHN0ZGVycik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3RybmNhc2VjbXAoa2V5LCAiRVhJVCIsIDQpID09IDApIHsKKwkJCWlmIChvcCAhPSBLRVlfT1BfQVNTSUdOKSB7CisJCQkJUGVycm9yKHNwYWNlLCAiaW52YWxpZCBFWElUIG9wZXJhdGlvbiIpOworCQkJCWdvdG8gaW52YWxpZDsKKwkJCX0KKwkJCXN0cmxjcHkoc3RyaW5nLCB2YWx1ZSwgc2l6ZW9mKHN0cmluZykpOworCQkJYXBwbHlfZm9ybWF0KHNwYWNlLCBzdHJpbmcsIHNpemVvZihzdHJpbmcpKTsKKwkJCWlmIChzdHJjbXAoc3RyaW5nLCAicmV0dXJuIikgPT0gMCkKKwkJCQlyZXR1cm4gLUVKVVNUUkVUVVJOOworCQkJc3BhY2UtPmV4aXRfY29kZSA9IHN0cnRvbChzdHJpbmcsIE5VTEwsIDApOworCQkJc3BhY2UtPnF1aXQgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHN0cm5jYXNlY21wKGtleSwgIkNPTkZJR3siLCA3KSA9PSAwKSB7CisJCQlhdHRyID0gZ2V0X2tleV9hdHRyaWJ1dGUoc3BhY2UsIGtleSArIDYsIHN0cmluZywgc2l6ZW9mKHN0cmluZykpOworCQkJaWYgKGF0dHIgPT0gTlVMTCkgeworCQkJCVBlcnJvcihzcGFjZSwgImVycm9yIHBhcnNpbmcgQ09ORklHIGF0dHJpYnV0ZSIpOworCQkJCWdvdG8gaW52YWxpZDsKKwkJCX0KKwkJCXN0cmxjcHkocmVzdWx0LCB2YWx1ZSwgc2l6ZW9mKHJlc3VsdCkpOworCQkJYXBwbHlfZm9ybWF0KHNwYWNlLCByZXN1bHQsIHNpemVvZihyZXN1bHQpKTsKKwkJCWlmIChvcCA9PSBLRVlfT1BfQVNTSUdOKSB7CisJCQkJZXJyID0gdmFsdWVfc2V0KHNwYWNlLCBhdHRyLCByZXN1bHQpOworCQkJCWRiZygiQ09ORklHeyVzfT0nJXMnIiwgYXR0ciwgcmVzdWx0KTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAob3AgPT0gS0VZX09QX01BVENIIHx8IG9wID09IEtFWV9PUF9OT01BVENIKSB7CisJCQkJcGFpciA9IHZhbHVlX2ZpbmQoc3BhY2UsIGF0dHIpOworCQkJCWlmIChwYWlyID09IE5VTEwpCisJCQkJCWJyZWFrOworCQkJCWlmICghZG9fbWF0Y2goa2V5LCBvcCwgcmVzdWx0LCBwYWlyLT52YWx1ZSkpCisJCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlQZXJyb3Ioc3BhY2UsICJpbnZhbGlkIENPTkZJR3t9IG9wZXJhdGlvbiIpOworCQkJCWdvdG8gaW52YWxpZDsKKwkJCX0KKwkJfQorCisJCVBlcnJvcihzcGFjZSwgInVua25vd24ga2V5ICclcyciLCBrZXkpOworCX0KKwlyZXR1cm4gZXJyOworCitpbnZhbGlkOgorCVBlcnJvcihzcGFjZSwgImludmFsaWQgcnVsZSIpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHBhcnNlKHN0cnVjdCBzcGFjZSAqc3BhY2UsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWNoYXIgKmJ1ZiwgKmJ1ZmxpbmUsICpsaW5lOworCXNpemVfdCBidWZzaXplLCBwb3MsIGNvdW50LCBsaW5lc2l6ZTsKKwl1bnNpZ25lZCBpbnQgbGluZW51bSwgaSwgaiwgbGluZW51bV9hZGo7CisJaW50IGVycjsKKworCWRiZygic3RhcnQgb2YgZmlsZSAnJXMnIiwgZmlsZW5hbWUpOworCisJaWYgKGZpbGVfbWFwKGZpbGVuYW1lLCAmYnVmLCAmYnVmc2l6ZSkgIT0gMCkgeworCQllcnIgPSBlcnJubzsKKwkJZXJyb3IoIlVuYWJsZSB0byBvcGVuIGZpbGUgJyVzJzogJXMiLCBmaWxlbmFtZSwgc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybiAtZXJyOworCX0KKworCWVyciA9IDA7CQorCXBvcyA9IDA7CisJbGluZW51bSA9IDA7CisJbGluZXNpemUgPSAxMjg7CisJbGluZSA9IG1hbGxvYyhsaW5lc2l6ZSk7CisJaWYgKGxpbmUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJc3BhY2UtPmZpbGVuYW1lID0gZmlsZW5hbWU7CisJd2hpbGUgKCFlcnIgJiYgcG9zIDwgYnVmc2l6ZSAmJiAhc3BhY2UtPnF1aXQpIHsKKwkJY291bnQgPSBsaW5lX3dpZHRoKGJ1ZiwgYnVmc2l6ZSwgcG9zKTsKKwkJYnVmbGluZSA9IGJ1ZiArIHBvczsKKwkJcG9zICs9IGNvdW50ICsgMTsKKwkJbGluZW51bSsrOworCQkKKwkJLyogc2tpcCB3aGl0ZXNwYWNlcyAqLworCQl3aGlsZSAoY291bnQgPiAwICYmIGlzc3BhY2UoYnVmbGluZVswXSkpIHsKKwkJCWJ1ZmxpbmUrKzsKKwkJCWNvdW50LS07CisJCX0KKwkJaWYgKGNvdW50ID09IDApCisJCQljb250aW51ZTsKKwkJCQorCQkvKiBjb21tZW50IGNoZWNrICovCisJCWlmIChidWZsaW5lWzBdID09ICcjJykKKwkJCWNvbnRpbnVlOworCQkKKwkJaWYgKGNvdW50ID4gbGluZXNpemUgLSAxKSB7CisJCQlmcmVlKGxpbmUpOworCQkJbGluZXNpemUgPSAoY291bnQgKyAxMjcgKyAxKSAmIH4xMjc7CisJCQlpZiAobGluZXNpemUgPiAyMDQ4KSB7CisJCQkJZXJyb3IoImZpbGUgJXMsIGxpbmUgJWkgdG9vIGxvbmciLCBmaWxlbmFtZSwgbGluZW51bSk7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWxpbmUgPSBtYWxsb2MobGluZXNpemUpOworCQkJaWYgKGxpbmUgPT0gTlVMTCkgeworCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJCisJCS8qIHNraXAgYmFja3NsYXNoIGFuZCBuZXdsaW5lIGZyb20gbXVsdGlsaW5lIHJ1bGVzICovCisJCWxpbmVudW1fYWRqID0gMDsKKwkJZm9yIChpID0gaiA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlpZiAoYnVmbGluZVtpXSA9PSAnXFwnICYmIGJ1ZmxpbmVbaSsxXSA9PSAnXG4nKSB7CisJCQkJbGluZW51bV9hZGorKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWxpbmVbaisrXSA9IGJ1ZmxpbmVbaV07CisJCX0KKwkJbGluZVtqXSA9ICdcMCc7CisKKwkJZGJnKCJyZWFkICglaSkgJyVzJyIsIGxpbmVudW0sIGxpbmUpOworCQlzcGFjZS0+bGluZW51bSA9IGxpbmVudW07CisJCWVyciA9IHBhcnNlX2xpbmUoc3BhY2UsIGxpbmUsIGxpbmVzaXplKTsKKwkJaWYgKGVyciA9PSAtRUpVU1RSRVRVUk4pIHsKKwkJCWVyciA9IDA7CisJCQlicmVhazsKKwkJfQorCQlsaW5lbnVtICs9IGxpbmVudW1fYWRqOworCX0KKworCWZyZWUobGluZSk7CisJc3BhY2UtPmZpbGVuYW1lID0gTlVMTDsKKwlzcGFjZS0+bGluZW51bSA9IC0xOworCWZpbGVfdW5tYXAoYnVmLCBidWZzaXplKTsKKwlkYmcoImVuZCBvZiBmaWxlICclcyciLCBmaWxlbmFtZSk7CisJcmV0dXJuIGVyciA/IGVyciA6IC1hYnMoc3BhY2UtPmV4aXRfY29kZSk7Cit9CisKK2ludCBpbml0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpjYXJkbmFtZSkKK3sKKwlzdHJ1Y3Qgc3BhY2UgKnNwYWNlOworCWludCBlcnIgPSAwLCBjYXJkLCBmaXJzdDsKKwkKKwlzeXNmc19pbml0KCk7CisJaWYgKCFjYXJkbmFtZSkgeworCQlmaXJzdCA9IDE7CisJCWNhcmQgPSAtMTsKKwkJd2hpbGUgKDEpIHsKKwkJCWlmIChzbmRfY2FyZF9uZXh0KCZjYXJkKSA8IDApCisJCQkJYnJlYWs7CisJCQlpZiAoY2FyZCA8IDApIHsKKwkJCQlpZiAoZmlyc3QpIHsKKwkJCQkJZXJyb3IoIk5vIHNvdW5kY2FyZHMgZm91bmQuLi4iKTsKKwkJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJZmlyc3QgPSAwOworCQkJZXJyID0gaW5pdF9zcGFjZSgmc3BhY2UsIGNhcmQpOworCQkJaWYgKGVyciA9PSAwKSB7CisJCQkJc3BhY2UtPnJvb3RkaXIgPSBuZXdfcm9vdF9kaXIoZmlsZW5hbWUpOworCQkJCWlmIChzcGFjZS0+cm9vdGRpciAhPSBOVUxMKQorCQkJCQllcnIgPSBwYXJzZShzcGFjZSwgZmlsZW5hbWUpOworCQkJCWZyZWVfc3BhY2Uoc3BhY2UpOworCQkJfQorCQkJaWYgKGVyciA8IDApCisJCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQljYXJkID0gc25kX2NhcmRfZ2V0X2luZGV4KGNhcmRuYW1lKTsKKwkJaWYgKGNhcmQgPCAwKSB7CisJCQllcnJvcigiQ2Fubm90IGZpbmQgc291bmRjYXJkICclcycuLi4iLCBjYXJkbmFtZSk7CisJCQlnb3RvIGVycm9yOworCQl9CisJCW1lbXNldCgmc3BhY2UsIDAsIHNpemVvZihzcGFjZSkpOworCQllcnIgPSBpbml0X3NwYWNlKCZzcGFjZSwgY2FyZCk7CisJCWlmIChlcnIgPT0gMCkgeworCQkJc3BhY2UtPnJvb3RkaXIgPSBuZXdfcm9vdF9kaXIoZmlsZW5hbWUpOworCQkJaWYgKHNwYWNlLT5yb290ZGlyICAhPSBOVUxMKQorCQkJCWVyciA9IHBhcnNlKHNwYWNlLCBmaWxlbmFtZSk7CisJCQlmcmVlX3NwYWNlKHNwYWNlKTsKKwkJfQorCX0KKyAgZXJyb3I6CisJc3lzZnNfY2xlYW51cCgpOworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9hbHNhY3RsL2luaXRfc3lzZGVwcy5jIGIvYWxzYWN0bC9pbml0X3N5c2RlcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWNhMWI0Ci0tLSAvZGV2L251bGwKKysrIGIvYWxzYWN0bC9pbml0X3N5c2RlcHMuYwpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqCXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICoJRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqIAorICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICoJV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqCUdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqCXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKgk1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpZiBkZWZpbmVkKF9fR0xJQkNfXykgJiYgIShkZWZpbmVkKF9fVUNMSUJDX18pICYmIGRlZmluZWQoX19VU0VfQlNEKSkKK3N0YXRpYyBzaXplX3Qgc3RybGNweShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNpemUpCit7CisJc2l6ZV90IGJ5dGVzID0gMDsKKwljaGFyICpxID0gZHN0OworCWNvbnN0IGNoYXIgKnAgPSBzcmM7CisJY2hhciBjaDsKKworCXdoaWxlICgoY2ggPSAqcCsrKSkgeworCQlpZiAoYnl0ZXMrMSA8IHNpemUpCisJCQkqcSsrID0gY2g7CisJCWJ5dGVzKys7CisJfQorCisJLyogSWYgc2l6ZSA9PSAwIHRoZXJlIGlzIG5vIHNwYWNlIGZvciBhIGZpbmFsIG51bGwuLi4gKi8KKwlpZiAoc2l6ZSkKKwkJKnEgPSAnXDAnOworCXJldHVybiBieXRlczsKK30KKworc3RhdGljIHNpemVfdCBzdHJsY2F0KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc2l6ZSkKK3sKKwlzaXplX3QgYnl0ZXMgPSAwOworCWNoYXIgKnEgPSBkc3Q7CisJY29uc3QgY2hhciAqcCA9IHNyYzsKKwljaGFyIGNoOworCisJd2hpbGUgKGJ5dGVzIDwgc2l6ZSAmJiAqcSkgeworCQlxKys7CisJCWJ5dGVzKys7CisJfQorCWlmIChieXRlcyA9PSBzaXplKQorCQlyZXR1cm4gKGJ5dGVzICsgc3RybGVuKHNyYykpOworCisJd2hpbGUgKChjaCA9ICpwKyspKSB7CisJCWlmIChieXRlcysxIDwgc2l6ZSkKKwkJKnErKyA9IGNoOworCQlieXRlcysrOworCX0KKworCSpxID0gJ1wwJzsKKwlyZXR1cm4gYnl0ZXM7Cit9CisjZW5kaWYgLyogX19HTElCQ19fICovCmRpZmYgLS1naXQgYS9hbHNhY3RsL2luaXRfc3lzZnMuYyBiL2Fsc2FjdGwvaW5pdF9zeXNmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYmFkYTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbHNhY3RsL2luaXRfc3lzZnMuYwpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCSAgICAgICAgICAgICAgMjAwOCBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKiAKKyAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqCVdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKglHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKgl3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICoJNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisKK3N0YXRpYyBjaGFyIHN5c2ZzX3BhdGhbUEFUSF9TSVpFXTsKKworLyogYXR0cmlidXRlIHZhbHVlIGNhY2hlICovCitzdGF0aWMgTElTVF9IRUFEKGF0dHJfbGlzdCk7CitzdHJ1Y3Qgc3lzZnNfYXR0ciB7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCWNoYXIgcGF0aFtQQVRIX1NJWkVdOworCWNoYXIgKnZhbHVlOwkJCS8qIHBvaW50cyB0byB2YWx1ZV9sb2NhbCBpZiB2YWx1ZSBpcyBjYWNoZWQgKi8KKwljaGFyIHZhbHVlX2xvY2FsW05BTUVfU0laRV07Cit9OworCitzdGF0aWMgaW50IHN5c2ZzX2luaXQodm9pZCkKK3sKKwljb25zdCBjaGFyICplbnY7CisJY2hhciBzeXNmc190ZXN0W1BBVEhfU0laRV07CisKKwllbnYgPSBnZXRlbnYoIlNZU0ZTX1BBVEgiKTsKKwlpZiAoZW52KSB7CisJCXN0cmxjcHkoc3lzZnNfcGF0aCwgZW52LCBzaXplb2Yoc3lzZnNfcGF0aCkpOworCQlyZW1vdmVfdHJhaWxpbmdfY2hhcnMoc3lzZnNfcGF0aCwgJy8nKTsKKwl9IGVsc2UKKwkJc3RybGNweShzeXNmc19wYXRoLCAiL3N5cyIsIHNpemVvZihzeXNmc19wYXRoKSk7CisJZGJnKCJzeXNmc19wYXRoPSclcyciLCBzeXNmc19wYXRoKTsKKworCXN0cmxjcHkoc3lzZnNfdGVzdCwgc3lzZnNfcGF0aCwgc2l6ZW9mKHN5c2ZzX3Rlc3QpKTsKKwlzdHJsY2F0KHN5c2ZzX3Rlc3QsICIva2VybmVsL3VldmVudF9oZWxwZXIiLCBzaXplb2Yoc3lzZnNfdGVzdCkpOworCWlmIChhY2Nlc3Moc3lzZnNfdGVzdCwgRl9PSykpIHsKKwkJZXJyb3IoInN5c2ZzIHBhdGggJyVzJyBpcyBpbnZhbGlkXG4iLCBzeXNmc19wYXRoKTsKKwkJcmV0dXJuIC1lcnJubzsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmYXR0cl9saXN0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3lzZnNfY2xlYW51cCh2b2lkKQoreworCXN0cnVjdCBzeXNmc19hdHRyICphdHRyX2xvb3A7CisJc3RydWN0IHN5c2ZzX2F0dHIgKmF0dHJfdGVtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhdHRyX2xvb3AsIGF0dHJfdGVtcCwgJmF0dHJfbGlzdCwgbm9kZSkgeworCQlsaXN0X2RlbCgmYXR0cl9sb29wLT5ub2RlKTsKKwkJZnJlZShhdHRyX2xvb3ApOworCX0KK30KKworc3RhdGljIGNoYXIgKnN5c2ZzX2F0dHJfZ2V0X3ZhbHVlKGNvbnN0IGNoYXIgKmRldnBhdGgsIGNvbnN0IGNoYXIgKmF0dHJfbmFtZSkKK3sKKwljaGFyIHBhdGhfZnVsbFtQQVRIX1NJWkVdOworCWNvbnN0IGNoYXIgKnBhdGg7CisJY2hhciB2YWx1ZVtOQU1FX1NJWkVdOworCXN0cnVjdCBzeXNmc19hdHRyICphdHRyX2xvb3A7CisJc3RydWN0IHN5c2ZzX2F0dHIgKmF0dHI7CisJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKwlpbnQgZmQ7CisJc3NpemVfdCBzaXplOworCXNpemVfdCBzeXNmc19sZW47CisKKwlkYmcoIm9wZW4gJyVzJy8nJXMnIiwgZGV2cGF0aCwgYXR0cl9uYW1lKTsKKwlzeXNmc19sZW4gPSBzdHJsY3B5KHBhdGhfZnVsbCwgc3lzZnNfcGF0aCwgc2l6ZW9mKHBhdGhfZnVsbCkpOworCXBhdGggPSAmcGF0aF9mdWxsW3N5c2ZzX2xlbl07CisJc3RybGNhdChwYXRoX2Z1bGwsIGRldnBhdGgsIHNpemVvZihwYXRoX2Z1bGwpKTsKKwlzdHJsY2F0KHBhdGhfZnVsbCwgIi8iLCBzaXplb2YocGF0aF9mdWxsKSk7CisJc3RybGNhdChwYXRoX2Z1bGwsIGF0dHJfbmFtZSwgc2l6ZW9mKHBhdGhfZnVsbCkpOworCisJLyogbG9vayBmb3IgYXR0cmlidXRlIGluIGNhY2hlICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShhdHRyX2xvb3AsICZhdHRyX2xpc3QsIG5vZGUpIHsKKwkJaWYgKHN0cmNtcChhdHRyX2xvb3AtPnBhdGgsIHBhdGgpID09IDApIHsKKwkJCWRiZygiZm91bmQgaW4gY2FjaGUgJyVzJyIsIGF0dHJfbG9vcC0+cGF0aCk7CisJCQlyZXR1cm4gYXR0cl9sb29wLT52YWx1ZTsKKwkJfQorCX0KKworCS8qIHN0b3JlIGF0dHJpYnV0ZSBpbiBjYWNoZSAoYWxzbyBuZWdhdGl2ZXMgYXJlIGtlcHQgaW4gY2FjaGUpICovCisJZGJnKCJuZXcgdW5jYWNoZWQgYXR0cmlidXRlICclcyciLCBwYXRoX2Z1bGwpOworCWF0dHIgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzeXNmc19hdHRyKSk7CisJaWYgKGF0dHIgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KGF0dHIsIDB4MDAsIHNpemVvZihzdHJ1Y3Qgc3lzZnNfYXR0cikpOworCXN0cmxjcHkoYXR0ci0+cGF0aCwgcGF0aCwgc2l6ZW9mKGF0dHItPnBhdGgpKTsKKwlkYmcoImFkZCB0byBjYWNoZSAnJXMnIiwgcGF0aF9mdWxsKTsKKwlsaXN0X2FkZCgmYXR0ci0+bm9kZSwgJmF0dHJfbGlzdCk7CisKKwlpZiAobHN0YXQocGF0aF9mdWxsLCAmc3RhdGJ1ZikgIT0gMCkgeworCQlkYmcoInN0YXQgJyVzJyBmYWlsZWQ6ICVzIiwgcGF0aF9mdWxsLCBzdHJlcnJvcihlcnJubykpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoU19JU0xOSyhzdGF0YnVmLnN0X21vZGUpKSB7CisJCS8qIGxpbmtzIHJldHVybiB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSB0YXJnZXQgcGF0aCAqLworCQljaGFyIGxpbmtfdGFyZ2V0W1BBVEhfU0laRV07CisJCWludCBsZW47CisJCWNvbnN0IGNoYXIgKnBvczsKKworCQlsZW4gPSByZWFkbGluayhwYXRoX2Z1bGwsIGxpbmtfdGFyZ2V0LCBzaXplb2YobGlua190YXJnZXQpKTsKKwkJaWYgKGxlbiA+IDApIHsKKwkJCWxpbmtfdGFyZ2V0W2xlbl0gPSAnXDAnOworCQkJcG9zID0gc3RycmNocihsaW5rX3RhcmdldCwgJy8nKTsKKwkJCWlmIChwb3MgIT0gTlVMTCkgeworCQkJCWRiZygiY2FjaGUgJyVzJyB3aXRoIGxpbmsgdmFsdWUgJyVzJyIsIHBhdGhfZnVsbCwgcG9zKzEpOworCQkJCXN0cmxjcHkoYXR0ci0+dmFsdWVfbG9jYWwsICZwb3NbMV0sIHNpemVvZihhdHRyLT52YWx1ZV9sb2NhbCkpOworCQkJCWF0dHItPnZhbHVlID0gYXR0ci0+dmFsdWVfbG9jYWw7CisJCQl9CisJCX0KKwkJZ290byBvdXQ7CisJfQorCisJLyogc2tpcCBkaXJlY3RvcmllcyAqLworCWlmIChTX0lTRElSKHN0YXRidWYuc3RfbW9kZSkpCisJCWdvdG8gb3V0OworCisJLyogc2tpcCBub24tcmVhZGFibGUgZmlsZXMgKi8KKwlpZiAoKHN0YXRidWYuc3RfbW9kZSAmIFNfSVJVU1IpID09IDApCisJCWdvdG8gb3V0OworCisJLyogcmVhZCBhdHRyaWJ1dGUgdmFsdWUgKi8KKwlmZCA9IG9wZW4ocGF0aF9mdWxsLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkgeworCQlkYmcoImF0dHJpYnV0ZSAnJXMnIGRvZXMgbm90IGV4aXN0IiwgcGF0aF9mdWxsKTsKKwkJZ290byBvdXQ7CisJfQorCXNpemUgPSByZWFkKGZkLCB2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7CisJY2xvc2UoZmQpOworCWlmIChzaXplIDwgMCkKKwkJZ290byBvdXQ7CisJaWYgKHNpemUgPT0gc2l6ZW9mKHZhbHVlKSkKKwkJZ290byBvdXQ7CisKKwkvKiBnb3QgYSB2YWxpZCB2YWx1ZSwgc3RvcmUgYW5kIHJldHVybiBpdCAqLworCXZhbHVlW3NpemVdID0gJ1wwJzsKKwlyZW1vdmVfdHJhaWxpbmdfY2hhcnModmFsdWUsICdcbicpOworCWRiZygiY2FjaGUgJyVzJyB3aXRoIGF0dHJpYnV0ZSB2YWx1ZSAnJXMnIiwgcGF0aF9mdWxsLCB2YWx1ZSk7CisJc3RybGNweShhdHRyLT52YWx1ZV9sb2NhbCwgdmFsdWUsIHNpemVvZihhdHRyLT52YWx1ZV9sb2NhbCkpOworCWF0dHItPnZhbHVlID0gYXR0ci0+dmFsdWVfbG9jYWw7CisKK291dDoKKwlyZXR1cm4gYXR0ci0+dmFsdWU7Cit9CmRpZmYgLS1naXQgYS9hbHNhY3RsL2luaXRfdXRpbHNfcnVuLmMgYi9hbHNhY3RsL2luaXRfdXRpbHNfcnVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRlNDkwYgotLS0gL2Rldi9udWxsCisrKyBiL2Fsc2FjdGwvaW5pdF91dGlsc19ydW4uYwpAQCAtMCwwICsxLDI0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICoJdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKglGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICogCisgKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKglXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICoJR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICoJd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqCTUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2RlZmluZSBNWV9NQVgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQorCisjZGVmaW5lIFJFQURfRU5ECTAKKyNkZWZpbmUgV1JJVEVfRU5ECTEKKworc3RhdGljCitpbnQgcnVuX3Byb2dyYW0xKHN0cnVjdCBzcGFjZSAqc3BhY2UsCisJICAgICAgICAgY29uc3QgY2hhciAqY29tbWFuZDAsIGNoYXIgKnJlc3VsdCwKKwkJIHNpemVfdCByZXNzaXplLCBzaXplX3QgKnJlc2xlbiwgaW50IGxvZyk7CisKK3N0YXRpYworaW50IHJ1bl9wcm9ncmFtMChzdHJ1Y3Qgc3BhY2UgKnNwYWNlLAorCSAgICAgICAgIGNvbnN0IGNoYXIgKmNvbW1hbmQwLCBjaGFyICpyZXN1bHQsCisJCSBzaXplX3QgcmVzc2l6ZSwgc2l6ZV90ICpyZXNsZW4sIGludCBsb2cpCit7CisJaW50IHJldHZhbCA9IDA7CisJaW50IHN0YXR1czsKKwlpbnQgb3V0cGlwZVsyXSA9IHstMSwgLTF9OworCWludCBlcnJwaXBlWzJdID0gey0xLCAtMX07CisJcGlkX3QgcGlkOworCWNoYXIgYXJnW1BBVEhfU0laRV07CisJY2hhciBwcm9ncmFtW1BBVEhfU0laRV07CisJY2hhciAqYXJndlsoc2l6ZW9mKGFyZykgLyAyKSArIDFdOworCWludCBkZXZudWxsOworCWludCBpOworCisJLyogYnVpbGQgYXJndiBmcm9tIGNvbWFuZCAqLworCXN0cmxjcHkoYXJnLCBjb21tYW5kMCwgc2l6ZW9mKGFyZykpOworCWkgPSAwOworCWlmIChzdHJjaHIoYXJnLCAnICcpICE9IE5VTEwpIHsKKwkJY2hhciAqcG9zID0gYXJnOworCisJCXdoaWxlIChwb3MgIT0gTlVMTCkgeworCQkJaWYgKHBvc1swXSA9PSAnXCcnKSB7CisJCQkJLyogZG9uJ3Qgc2VwYXJhdGUgaWYgaW4gYXBvc3Ryb3BoZXMgKi8KKwkJCQlwb3MrKzsKKwkJCQlhcmd2W2ldID0gc3Ryc2VwKCZwb3MsICJcJyIpOworCQkJCXdoaWxlIChwb3MgIT0gTlVMTCAmJiBwb3NbMF0gPT0gJyAnKQorCQkJCQlwb3MrKzsKKwkJCX0gZWxzZSB7CisJCQkJYXJndltpXSA9IHN0cnNlcCgmcG9zLCAiICIpOworCQkJfQorCQkJZGJnKCJhcmdbJWldICclcyciLCBpLCBhcmd2W2ldKTsKKwkJCWkrKzsKKwkJfQorCQlhcmd2W2ldID0gTlVMTDsKKwl9IGVsc2UgeworCQlhcmd2WzBdID0gYXJnOworCQlhcmd2WzFdID0gTlVMTDsKKwl9CisJaW5mbygiJyVzJyIsIGNvbW1hbmQwKTsKKworCS8qIHByZXBhcmUgcGlwZXMgZnJvbSBjaGlsZCB0byBwYXJlbnQgKi8KKwlpZiAocmVzdWx0IHx8IGxvZykgeworCQlpZiAocGlwZShvdXRwaXBlKSAhPSAwKSB7CisJCQlQZXJyb3Ioc3BhY2UsICJwaXBlIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCWlmIChsb2cpIHsKKwkJaWYgKHBpcGUoZXJycGlwZSkgIT0gMCkgeworCQkJUGVycm9yKHNwYWNlLCAicGlwZSBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCS8qIGFsbG93IHByb2dyYW1zIGluIC9saWIvYWxzYSBjYWxsZWQgd2l0aG91dCB0aGUgcGF0aCAqLworCWlmIChzdHJjaHIoYXJndlswXSwgJy8nKSA9PSBOVUxMKSB7CisJCXN0cmxjcHkocHJvZ3JhbSwgIi9saWIvYWxzYS8iLCBzaXplb2YocHJvZ3JhbSkpOworCQlzdHJsY2F0KHByb2dyYW0sIGFyZ3ZbMF0sIHNpemVvZihwcm9ncmFtKSk7CisJCWFyZ3ZbMF0gPSBwcm9ncmFtOworCX0KKworCXBpZCA9IGZvcmsoKTsKKwlzd2l0Y2gocGlkKSB7CisJY2FzZSAwOgorCQkvKiBjaGlsZCBjbG9zZXMgcGFyZW50IGVuZHMgb2YgcGlwZXMgKi8KKwkJaWYgKG91dHBpcGVbUkVBRF9FTkRdID4gMCkKKwkJCWNsb3NlKG91dHBpcGVbUkVBRF9FTkRdKTsKKwkJaWYgKGVycnBpcGVbUkVBRF9FTkRdID4gMCkKKwkJCWNsb3NlKGVycnBpcGVbUkVBRF9FTkRdKTsKKworCQkvKiBkaXNjYXJkIGNoaWxkIG91dHB1dCBvciBjb25uZWN0IHRvIHBpcGUgKi8KKwkJZGV2bnVsbCA9IG9wZW4oIi9kZXYvbnVsbCIsIE9fUkRXUik7CisJCWlmIChkZXZudWxsID4gMCkgeworCQkJZHVwMihkZXZudWxsLCBTVERJTl9GSUxFTk8pOworCQkJaWYgKG91dHBpcGVbV1JJVEVfRU5EXSA8IDApCisJCQkJZHVwMihkZXZudWxsLCBTVERPVVRfRklMRU5PKTsKKwkJCWlmIChlcnJwaXBlW1dSSVRFX0VORF0gPCAwKQorCQkJCWR1cDIoZGV2bnVsbCwgU1RERVJSX0ZJTEVOTyk7CisJCQljbG9zZShkZXZudWxsKTsKKwkJfSBlbHNlCisJCQlQZXJyb3Ioc3BhY2UsICJvcGVuIC9kZXYvbnVsbCBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJaWYgKG91dHBpcGVbV1JJVEVfRU5EXSA+IDApIHsKKwkJCWR1cDIob3V0cGlwZVtXUklURV9FTkRdLCBTVERPVVRfRklMRU5PKTsKKwkJCWNsb3NlKG91dHBpcGVbV1JJVEVfRU5EXSk7CisJCX0KKwkJaWYgKGVycnBpcGVbV1JJVEVfRU5EXSA+IDApIHsKKwkJCWR1cDIoZXJycGlwZVtXUklURV9FTkRdLCBTVERFUlJfRklMRU5PKTsKKwkJCWNsb3NlKGVycnBpcGVbV1JJVEVfRU5EXSk7CisJCX0KKwkJZXhlY3YoYXJndlswXSwgYXJndik7CisKKwkJLyogd2Ugc2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMgKi8KKwkJUGVycm9yKHNwYWNlLCAiZXhlYyBvZiBwcm9ncmFtICclcycgZmFpbGVkIiwgYXJndlswXSk7CisJCV9leGl0KDEpOworCWNhc2UgLTE6CisJCVBlcnJvcihzcGFjZSwgImZvcmsgb2YgJyVzJyBmYWlsZWQ6ICVzIiwgYXJndlswXSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCWRlZmF1bHQ6CisJCS8qIHJlYWQgZnJvbSBjaGlsZCBpZiByZXF1ZXN0ZWQgKi8KKwkJaWYgKG91dHBpcGVbUkVBRF9FTkRdID4gMCB8fCBlcnJwaXBlW1JFQURfRU5EXSA+IDApIHsKKwkJCXNzaXplX3QgY291bnQ7CisJCQlzaXplX3QgcmVzcG9zID0gMDsKKworCQkJLyogcGFyZW50IGNsb3NlcyBjaGlsZCBlbmRzIG9mIHBpcGVzICovCisJCQlpZiAob3V0cGlwZVtXUklURV9FTkRdID4gMCkKKwkJCQljbG9zZShvdXRwaXBlW1dSSVRFX0VORF0pOworCQkJaWYgKGVycnBpcGVbV1JJVEVfRU5EXSA+IDApCisJCQkJY2xvc2UoZXJycGlwZVtXUklURV9FTkRdKTsKKworCQkJLyogcmVhZCBjaGlsZCBvdXRwdXQgKi8KKwkJCXdoaWxlIChvdXRwaXBlW1JFQURfRU5EXSA+IDAgfHwgZXJycGlwZVtSRUFEX0VORF0gPiAwKSB7CisJCQkJaW50IGZkY291bnQ7CisJCQkJZmRfc2V0IHJlYWRmZHM7CisKKwkJCQlGRF9aRVJPKCZyZWFkZmRzKTsKKwkJCQlpZiAob3V0cGlwZVtSRUFEX0VORF0gPiAwKQorCQkJCQlGRF9TRVQob3V0cGlwZVtSRUFEX0VORF0sICZyZWFkZmRzKTsKKwkJCQlpZiAoZXJycGlwZVtSRUFEX0VORF0gPiAwKQorCQkJCQlGRF9TRVQoZXJycGlwZVtSRUFEX0VORF0sICZyZWFkZmRzKTsKKwkJCQlmZGNvdW50ID0gc2VsZWN0KE1ZX01BWChvdXRwaXBlW1JFQURfRU5EXSwgZXJycGlwZVtSRUFEX0VORF0pKzEsICZyZWFkZmRzLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwkJCQlpZiAoZmRjb3VudCA8IDApIHsKKwkJCQkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJCQkJY29udGludWU7CisJCQkJCXJldHZhbCA9IC0xOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvKiBnZXQgc3Rkb3V0ICovCisJCQkJaWYgKG91dHBpcGVbUkVBRF9FTkRdID4gMCAmJiBGRF9JU1NFVChvdXRwaXBlW1JFQURfRU5EXSwgJnJlYWRmZHMpKSB7CisJCQkJCWNoYXIgaW5idWZbMTAyNF07CisJCQkJCWNoYXIgKnBvczsKKwkJCQkJY2hhciAqbGluZTsKKworCQkJCQljb3VudCA9IHJlYWQob3V0cGlwZVtSRUFEX0VORF0sIGluYnVmLCBzaXplb2YoaW5idWYpLTEpOworCQkJCQlpZiAoY291bnQgPD0gMCkgeworCQkJCQkJY2xvc2Uob3V0cGlwZVtSRUFEX0VORF0pOworCQkJCQkJb3V0cGlwZVtSRUFEX0VORF0gPSAtMTsKKwkJCQkJCWlmIChjb3VudCA8IDApIHsKKwkJCQkJCQlQZXJyb3Ioc3BhY2UsICJzdGRpbiByZWFkIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQkJCQkJCXJldHZhbCA9IC0xOworCQkJCQkJfQorCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJaW5idWZbY291bnRdID0gJ1wwJzsKKworCQkJCQkvKiBzdG9yZSByZXN1bHQgZm9yIHJ1bGUgcHJvY2Vzc2luZyAqLworCQkJCQlpZiAocmVzdWx0KSB7CisJCQkJCQlpZiAocmVzcG9zICsgY291bnQgPCByZXNzaXplKSB7CisJCQkJCQkJbWVtY3B5KCZyZXN1bHRbcmVzcG9zXSwgaW5idWYsIGNvdW50KTsKKwkJCQkJCQlyZXNwb3MgKz0gY291bnQ7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCVBlcnJvcihzcGFjZSwgInJlc3NpemUgJWxkIHRvbyBzaG9ydCIsIChsb25nKXJlc3NpemUpOworCQkJCQkJCXJldHZhbCA9IC0xOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXBvcyA9IGluYnVmOworCQkJCQl3aGlsZSAoKGxpbmUgPSBzdHJzZXAoJnBvcywgIlxuIikpKQorCQkJCQkJaWYgKHBvcyB8fCBsaW5lWzBdICE9ICdcMCcpCisJCQkJCQkJaW5mbygiJyVzJyAoc3Rkb3V0KSAnJXMnIiwgYXJndlswXSwgbGluZSk7CisJCQkJfQorCisJCQkJLyogZ2V0IHN0ZGVyciAqLworCQkJCWlmIChlcnJwaXBlW1JFQURfRU5EXSA+IDAgJiYgRkRfSVNTRVQoZXJycGlwZVtSRUFEX0VORF0sICZyZWFkZmRzKSkgeworCQkJCQljaGFyIGVycmJ1ZlsxMDI0XTsKKwkJCQkJY2hhciAqcG9zOworCQkJCQljaGFyICpsaW5lOworCisJCQkJCWNvdW50ID0gcmVhZChlcnJwaXBlW1JFQURfRU5EXSwgZXJyYnVmLCBzaXplb2YoZXJyYnVmKS0xKTsKKwkJCQkJaWYgKGNvdW50IDw9IDApIHsKKwkJCQkJCWNsb3NlKGVycnBpcGVbUkVBRF9FTkRdKTsKKwkJCQkJCWVycnBpcGVbUkVBRF9FTkRdID0gLTE7CisJCQkJCQlpZiAoY291bnQgPCAwKQorCQkJCQkJCVBlcnJvcihzcGFjZSwgInN0ZGVyciByZWFkIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJZXJyYnVmW2NvdW50XSA9ICdcMCc7CisJCQkJCXBvcyA9IGVycmJ1ZjsKKwkJCQkJd2hpbGUgKChsaW5lID0gc3Ryc2VwKCZwb3MsICJcbiIpKSkKKwkJCQkJCWlmIChwb3MgfHwgbGluZVswXSAhPSAnXDAnKQorCQkJCQkJCWluZm8oIiclcycgKHN0ZGVycikgJyVzJyIsIGFyZ3ZbMF0sIGxpbmUpOworCQkJCX0KKwkJCX0KKwkJCWlmIChvdXRwaXBlW1JFQURfRU5EXSA+IDApCisJCQkJY2xvc2Uob3V0cGlwZVtSRUFEX0VORF0pOworCQkJaWYgKGVycnBpcGVbUkVBRF9FTkRdID4gMCkKKwkJCQljbG9zZShlcnJwaXBlW1JFQURfRU5EXSk7CisKKwkJCS8qIHJldHVybiB0aGUgY2hpbGRzIHN0ZG91dCBzdHJpbmcgKi8KKwkJCWlmIChyZXN1bHQpIHsKKwkJCQlyZXN1bHRbcmVzcG9zXSA9ICdcMCc7CisJCQkJZGJnKCJyZXN1bHQ9JyVzJyIsIHJlc3VsdCk7CisJCQkJaWYgKHJlc2xlbikKKwkJCQkJKnJlc2xlbiA9IHJlc3BvczsKKwkJCX0KKwkJfQorCQl3YWl0cGlkKHBpZCwgJnN0YXR1cywgMCk7CisJCWlmIChXSUZFWElURUQoc3RhdHVzKSkgeworCQkJaW5mbygiJyVzJyByZXR1cm5lZCB3aXRoIHN0YXR1cyAlaSIsIGFyZ3ZbMF0sIFdFWElUU1RBVFVTKHN0YXR1cykpOworCQkJaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gMCkKKwkJCQlyZXR2YWwgPSAtMTsKKwkJfSBlbHNlIHsKKwkJCVBlcnJvcihzcGFjZSwgIiclcycgYWJub3JtYWwgZXhpdCIsIGFyZ3ZbMF0pOworCQkJcmV0dmFsID0gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMKK2ludCBydW5fcHJvZ3JhbShzdHJ1Y3Qgc3BhY2UgKnNwYWNlLCBjb25zdCBjaGFyICpjb21tYW5kMCwgY2hhciAqcmVzdWx0LAorCQlzaXplX3QgcmVzc2l6ZSwgc2l6ZV90ICpyZXNsZW4sIGludCBsb2cpCit7CisJaWYgKGNvbW1hbmQwWzBdID09ICdfJyAmJiBjb21tYW5kMFsxXSA9PSAnXycpCisJCXJldHVybiBydW5fcHJvZ3JhbTEoc3BhY2UsIGNvbW1hbmQwLCByZXN1bHQsIHJlc3NpemUsIHJlc2xlbiwgbG9nKTsKKwlyZXR1cm4gcnVuX3Byb2dyYW0wKHNwYWNlLCBjb21tYW5kMCwgcmVzdWx0LCByZXNzaXplLCByZXNsZW4sIGxvZyk7Cit9CmRpZmYgLS1naXQgYS9hbHNhY3RsL2luaXRfdXRpbHNfc3RyaW5nLmMgYi9hbHNhY3RsL2luaXRfdXRpbHNfc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlYTgwMAotLS0gL2Rldi9udWxsCisrKyBiL2Fsc2FjdGwvaW5pdF91dGlsc19zdHJpbmcuYwpAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICoJdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKglGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICogCisgKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKglXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICoJR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICoJd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqCTUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworCitzdGF0aWMgdm9pZCByZW1vdmVfdHJhaWxpbmdfY2hhcnMoY2hhciAqcGF0aCwgY2hhciBjKQoreworCXNpemVfdCBsZW47CisKKwlsZW4gPSBzdHJsZW4ocGF0aCk7CisJd2hpbGUgKGxlbiA+IDAgJiYgcGF0aFtsZW4tMV0gPT0gYykKKwkJcGF0aFstLWxlbl0gPSAnXDAnOworfQorCisvKiBjb3VudCBvZiBjaGFyYWN0ZXJzIHVzZWQgdG8gZW5jb2RlIG9uZSB1bmljb2RlIGNoYXIgKi8KK3N0YXRpYyBpbnQgdXRmOF9lbmNvZGVkX2V4cGVjdGVkX2xlbihjb25zdCBjaGFyICpzdHIpCit7CisJdW5zaWduZWQgY2hhciBjID0gKHVuc2lnbmVkIGNoYXIpc3RyWzBdOworCisJaWYgKGMgPCAweDgwKQorCQlyZXR1cm4gMTsKKwlpZiAoKGMgJiAweGUwKSA9PSAweGMwKQorCQlyZXR1cm4gMjsKKwlpZiAoKGMgJiAweGYwKSA9PSAweGUwKQorCQlyZXR1cm4gMzsKKwlpZiAoKGMgJiAweGY4KSA9PSAweGYwKQorCQlyZXR1cm4gNDsKKwlpZiAoKGMgJiAweGZjKSA9PSAweGY4KQorCQlyZXR1cm4gNTsKKwlpZiAoKGMgJiAweGZlKSA9PSAweGZjKQorCQlyZXR1cm4gNjsKKwlyZXR1cm4gMDsKK30KKworLyogZGVjb2RlIG9uZSB1bmljb2RlIGNoYXIgKi8KK3N0YXRpYyBpbnQgdXRmOF9lbmNvZGVkX3RvX3VuaWNoYXIoY29uc3QgY2hhciAqc3RyKQoreworCWludCB1bmljaGFyOworCWludCBsZW47CisJaW50IGk7CisKKwlsZW4gPSB1dGY4X2VuY29kZWRfZXhwZWN0ZWRfbGVuKHN0cik7CisJc3dpdGNoIChsZW4pIHsKKwljYXNlIDE6CisJCXJldHVybiAoaW50KXN0clswXTsKKwljYXNlIDI6CisJCXVuaWNoYXIgPSBzdHJbMF0gJiAweDFmOworCQlicmVhazsKKwljYXNlIDM6CisJCXVuaWNoYXIgPSAoaW50KXN0clswXSAmIDB4MGY7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJdW5pY2hhciA9IChpbnQpc3RyWzBdICYgMHgwNzsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQl1bmljaGFyID0gKGludClzdHJbMF0gJiAweDAzOworCQlicmVhazsKKwljYXNlIDY6CisJCXVuaWNoYXIgPSAoaW50KXN0clswXSAmIDB4MDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwl9CisKKwlmb3IgKGkgPSAxOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYgKCgoaW50KXN0cltpXSAmIDB4YzApICE9IDB4ODApCisJCQlyZXR1cm4gLTE7CisJCXVuaWNoYXIgPDw9IDY7CisJCXVuaWNoYXIgfD0gKGludClzdHJbaV0gJiAweDNmOworCX0KKworCXJldHVybiB1bmljaGFyOworfQorCisvKiBleHBlY3RlZCBzaXplIHVzZWQgdG8gZW5jb2RlIG9uZSB1bmljb2RlIGNoYXIgKi8KK3N0YXRpYyBpbnQgdXRmOF91bmljaGFyX3RvX2VuY29kZWRfbGVuKGludCB1bmljaGFyKQoreworCWlmICh1bmljaGFyIDwgMHg4MCkKKwkJcmV0dXJuIDE7CisJaWYgKHVuaWNoYXIgPCAweDgwMCkKKwkJcmV0dXJuIDI7CisJaWYgKHVuaWNoYXIgPCAweDEwMDAwKQorCQlyZXR1cm4gMzsKKwlpZiAodW5pY2hhciA8IDB4MjAwMDAwKQorCQlyZXR1cm4gNDsKKwlpZiAodW5pY2hhciA8IDB4NDAwMDAwMCkKKwkJcmV0dXJuIDU7CisJcmV0dXJuIDY7Cit9CisKKy8qIGNoZWNrIGlmIHVuaWNvZGUgY2hhciBoYXMgYSB2YWxpZCBudW1lcmljIHJhbmdlICovCitzdGF0aWMgaW50IHV0ZjhfdW5pY2hhcl92YWxpZF9yYW5nZShpbnQgdW5pY2hhcikKK3sKKwlpZiAodW5pY2hhciA+IDB4MTBmZmZmKQorCQlyZXR1cm4gMDsKKwlpZiAoKHVuaWNoYXIgJiAweGZmZmZmODAwKSA9PSAweGQ4MDApCisJCXJldHVybiAwOworCWlmICgodW5pY2hhciA+IDB4ZmRjZikgJiYgKHVuaWNoYXIgPCAweGZkZjApKQorCQlyZXR1cm4gMDsKKwlpZiAoKHVuaWNoYXIgJiAweGZmZmYpID09IDB4ZmZmZikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qIHZhbGlkYXRlIG9uZSBlbmNvZGVkIHVuaWNvZGUgY2hhciBhbmQgcmV0dXJuIGl0cyBsZW5ndGggKi8KK3N0YXRpYyBpbnQgdXRmOF9lbmNvZGVkX3ZhbGlkX3VuaWNoYXIoY29uc3QgY2hhciAqc3RyKQoreworCWludCBsZW47CisJaW50IHVuaWNoYXI7CisJaW50IGk7CisKKwlsZW4gPSB1dGY4X2VuY29kZWRfZXhwZWN0ZWRfbGVuKHN0cik7CisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gLTE7CisKKwkvKiBhc2NpaSBpcyB2YWxpZCAqLworCWlmIChsZW4gPT0gMSkKKwkJcmV0dXJuIDE7CisKKwkvKiBjaGVjayBpZiBleHBlY3RlZCBlbmNvZGVkIGNoYXJzIGFyZSBhdmFpbGFibGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCWlmICgoc3RyW2ldICYgMHg4MCkgIT0gMHg4MCkKKwkJCXJldHVybiAtMTsKKworCXVuaWNoYXIgPSB1dGY4X2VuY29kZWRfdG9fdW5pY2hhcihzdHIpOworCisJLyogY2hlY2sgaWYgZW5jb2RlZCBsZW5ndGggbWF0Y2hlcyBlbmNvZGVkIHZhbHVlICovCisJaWYgKHV0ZjhfdW5pY2hhcl90b19lbmNvZGVkX2xlbih1bmljaGFyKSAhPSBsZW4pCisJCXJldHVybiAtMTsKKworCS8qIGNoZWNrIGlmIHZhbHVlIGhhcyB2YWxpZCByYW5nZSAqLworCWlmICghdXRmOF91bmljaGFyX3ZhbGlkX3JhbmdlKHVuaWNoYXIpKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gbGVuOworfQorCisvKiByZXBsYWNlIGV2ZXJ5dGhpbmcgYnV0IHdoaXRlbGlzdGVkIHBsYWluIGFzY2lpIGFuZCB2YWxpZCB1dGY4ICovCitzdGF0aWMgaW50IHJlcGxhY2VfdW50cnVzdGVkX2NoYXJzKGNoYXIgKnN0cikKK3sKKwlzaXplX3QgaSA9IDA7CisJaW50IHJlcGxhY2VkID0gMDsKKworCXdoaWxlIChzdHJbaV0gIT0gJ1wwJykgeworCQlpbnQgbGVuOworCisJCS8qIHZhbGlkIHByaW50YWJsZSBhc2NpaSBjaGFyICovCisJCWlmICgoc3RyW2ldID49ICcwJyAmJiBzdHJbaV0gPD0gJzknKSB8fAorCQkgICAgKHN0cltpXSA+PSAnQScgJiYgc3RyW2ldIDw9ICdaJykgfHwKKwkJICAgIChzdHJbaV0gPj0gJ2EnICYmIHN0cltpXSA8PSAneicpIHx8CisJCSAgICBzdHJjaHIoIiAjJCUrLS4vOj0/QF8sIiwgc3RyW2ldKSkgeworCQkJaSsrOworCQkJY29udGludWU7CisJCX0KKwkJLyogdmFsaWQgdXRmOCBpcyBhY2NlcHRlZCAqLworCQlsZW4gPSB1dGY4X2VuY29kZWRfdmFsaWRfdW5pY2hhcigmc3RyW2ldKTsKKwkJaWYgKGxlbiA+IDEpIHsKKwkJCWkgKz0gbGVuOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBldmVyeXRoaW5nIGVsc2UgaXMgZ2FyYmFnZSAqLworCQlzdHJbaV0gPSAnXyc7CisJCWkrKzsKKwkJcmVwbGFjZWQrKzsKKwl9CisKKwlyZXR1cm4gcmVwbGFjZWQ7Cit9CmRpZmYgLS1naXQgYS9hbHNhY3RsL2xpc3QuaCBiL2Fsc2FjdGwvbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MjY2MzAKLS0tIC9kZXYvbnVsbAorKysgYi9hbHNhY3RsL2xpc3QuaApAQCAtMCwwICsxLDI4OSBAQAorLyoKKyAqIENvcGllZCBmcm9tIHRoZSBMaW51eCBrZXJuZWwgc291cmNlIHRyZWUsIHZlcnNpb24gMi42LjAtdGVzdDEuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTCB2MiBhcyBwZXIgdGhlIHdob2xlIGtlcm5lbCBzb3VyY2UgdHJlZS4KKyAqCisgKi8KKworI2lmbmRlZiBfTElTVF9ICisjZGVmaW5lIF9MSVNUX0gKKworLyoqCisgKiBjb250YWluZXJfb2YgLSBjYXN0IGEgbWVtYmVyIG9mIGEgc3RydWN0dXJlIG91dCB0byB0aGUgY29udGFpbmluZyBzdHJ1Y3R1cmUKKyAqCisgKiBAcHRyOgl0aGUgcG9pbnRlciB0byB0aGUgbWVtYmVyLgorICogQHR5cGU6CXRoZSB0eXBlIG9mIHRoZSBjb250YWluZXIgc3RydWN0IHRoaXMgaXMgZW1iZWRkZWQgaW4uCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbWVtYmVyIHdpdGhpbiB0aGUgc3RydWN0LgorICoKKyAqLworI2RlZmluZSBjb250YWluZXJfb2YocHRyLCB0eXBlLCBtZW1iZXIpICh7CQkJXAorCWNvbnN0IHR5cGVvZiggKCh0eXBlICopMCktPm1lbWJlciApICpfX21wdHIgPSAocHRyKTsJXAorCSh0eXBlICopKCAoY2hhciAqKV9fbXB0ciAtIG9mZnNldG9mKHR5cGUsbWVtYmVyKSApO30pCisKKy8qCisgKiBUaGVzZSBhcmUgbm9uLU5VTEwgcG9pbnRlcnMgdGhhdCB3aWxsIHJlc3VsdCBpbiBwYWdlIGZhdWx0cworICogdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMsIHVzZWQgdG8gdmVyaWZ5IHRoYXQgbm9ib2R5IHVzZXMKKyAqIG5vbi1pbml0aWFsaXplZCBsaXN0IGVudHJpZXMuCisgKi8KKyNkZWZpbmUgTElTVF9QT0lTT04xICAoKHZvaWQgKikgMHgwMDEwMDEwMCkKKyNkZWZpbmUgTElTVF9QT0lTT04yICAoKHZvaWQgKikgMHgwMDIwMDIwMCkKKworLyoKKyAqIFNpbXBsZSBkb3VibHkgbGlua2VkIGxpc3QgaW1wbGVtZW50YXRpb24uCisgKgorICogU29tZSBvZiB0aGUgaW50ZXJuYWwgZnVuY3Rpb25zICgiX194eHgiKSBhcmUgdXNlZnVsIHdoZW4KKyAqIG1hbmlwdWxhdGluZyB3aG9sZSBsaXN0cyByYXRoZXIgdGhhbiBzaW5nbGUgZW50cmllcywgYXMKKyAqIHNvbWV0aW1lcyB3ZSBhbHJlYWR5IGtub3cgdGhlIG5leHQvcHJldiBlbnRyaWVzIGFuZCB3ZSBjYW4KKyAqIGdlbmVyYXRlIGJldHRlciBjb2RlIGJ5IHVzaW5nIHRoZW0gZGlyZWN0bHkgcmF0aGVyIHRoYW4KKyAqIHVzaW5nIHRoZSBnZW5lcmljIHNpbmdsZS1lbnRyeSByb3V0aW5lcy4KKyAqLworCitzdHJ1Y3QgbGlzdF9oZWFkIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0LCAqcHJldjsKK307CisKKyNkZWZpbmUgTElTVF9IRUFEX0lOSVQobmFtZSkgeyAmKG5hbWUpLCAmKG5hbWUpIH0KKworI2RlZmluZSBMSVNUX0hFQUQobmFtZSkgXAorCXN0cnVjdCBsaXN0X2hlYWQgbmFtZSA9IExJU1RfSEVBRF9JTklUKG5hbWUpCisKKyNkZWZpbmUgSU5JVF9MSVNUX0hFQUQocHRyKSBkbyB7IFwKKwkocHRyKS0+bmV4dCA9IChwdHIpOyAocHRyKS0+cHJldiA9IChwdHIpOyBcCit9IHdoaWxlICgwKQorCisvKgorICogSW5zZXJ0IGEgbmV3IGVudHJ5IGJldHdlZW4gdHdvIGtub3duIGNvbnNlY3V0aXZlIGVudHJpZXMuIAorICoKKyAqIFRoaXMgaXMgb25seSBmb3IgaW50ZXJuYWwgbGlzdCBtYW5pcHVsYXRpb24gd2hlcmUgd2Uga25vdworICogdGhlIHByZXYvbmV4dCBlbnRyaWVzIGFscmVhZHkhCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2xpc3RfYWRkKHN0cnVjdCBsaXN0X2hlYWQgKm5ldywKKwkJCSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKnByZXYsCisJCQkgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0KQoreworCW5leHQtPnByZXYgPSBuZXc7CisJbmV3LT5uZXh0ID0gbmV4dDsKKwluZXctPnByZXYgPSBwcmV2OworCXByZXYtPm5leHQgPSBuZXc7Cit9CisKKy8qKgorICogbGlzdF9hZGQgLSBhZGQgYSBuZXcgZW50cnkKKyAqIEBuZXc6IG5ldyBlbnRyeSB0byBiZSBhZGRlZAorICogQGhlYWQ6IGxpc3QgaGVhZCB0byBhZGQgaXQgYWZ0ZXIKKyAqCisgKiBJbnNlcnQgYSBuZXcgZW50cnkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBoZWFkLgorICogVGhpcyBpcyBnb29kIGZvciBpbXBsZW1lbnRpbmcgc3RhY2tzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9hZGQoc3RydWN0IGxpc3RfaGVhZCAqbmV3LCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCV9fbGlzdF9hZGQobmV3LCBoZWFkLCBoZWFkLT5uZXh0KTsKK30KKworLyoqCisgKiBsaXN0X2FkZF90YWlsIC0gYWRkIGEgbmV3IGVudHJ5CisgKiBAbmV3OiBuZXcgZW50cnkgdG8gYmUgYWRkZWQKKyAqIEBoZWFkOiBsaXN0IGhlYWQgdG8gYWRkIGl0IGJlZm9yZQorICoKKyAqIEluc2VydCBhIG5ldyBlbnRyeSBiZWZvcmUgdGhlIHNwZWNpZmllZCBoZWFkLgorICogVGhpcyBpcyB1c2VmdWwgZm9yIGltcGxlbWVudGluZyBxdWV1ZXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X2FkZF90YWlsKHN0cnVjdCBsaXN0X2hlYWQgKm5ldywgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlfX2xpc3RfYWRkKG5ldywgaGVhZC0+cHJldiwgaGVhZCk7Cit9CisKKy8qCisgKiBEZWxldGUgYSBsaXN0IGVudHJ5IGJ5IG1ha2luZyB0aGUgcHJldi9uZXh0IGVudHJpZXMKKyAqIHBvaW50IHRvIGVhY2ggb3RoZXIuCisgKgorICogVGhpcyBpcyBvbmx5IGZvciBpbnRlcm5hbCBsaXN0IG1hbmlwdWxhdGlvbiB3aGVyZSB3ZSBrbm93CisgKiB0aGUgcHJldi9uZXh0IGVudHJpZXMgYWxyZWFkeSEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fbGlzdF9kZWwoc3RydWN0IGxpc3RfaGVhZCAqIHByZXYsIHN0cnVjdCBsaXN0X2hlYWQgKiBuZXh0KQoreworCW5leHQtPnByZXYgPSBwcmV2OworCXByZXYtPm5leHQgPSBuZXh0OworfQorCisvKioKKyAqIGxpc3RfZGVsIC0gZGVsZXRlcyBlbnRyeSBmcm9tIGxpc3QuCisgKiBAZW50cnk6IHRoZSBlbGVtZW50IHRvIGRlbGV0ZSBmcm9tIHRoZSBsaXN0LgorICogTm90ZTogbGlzdF9lbXB0eSBvbiBlbnRyeSBkb2VzIG5vdCByZXR1cm4gdHJ1ZSBhZnRlciB0aGlzLCB0aGUgZW50cnkgaXMKKyAqIGluIGFuIHVuZGVmaW5lZCBzdGF0ZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxpc3RfZGVsKHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5KQoreworCV9fbGlzdF9kZWwoZW50cnktPnByZXYsIGVudHJ5LT5uZXh0KTsKKwllbnRyeS0+bmV4dCA9IExJU1RfUE9JU09OMTsKKwllbnRyeS0+cHJldiA9IExJU1RfUE9JU09OMjsKK30KKworLyoqCisgKiBsaXN0X2RlbF9pbml0IC0gZGVsZXRlcyBlbnRyeSBmcm9tIGxpc3QgYW5kIHJlaW5pdGlhbGl6ZSBpdC4KKyAqIEBlbnRyeTogdGhlIGVsZW1lbnQgdG8gZGVsZXRlIGZyb20gdGhlIGxpc3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X2RlbF9pbml0KHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5KQoreworCV9fbGlzdF9kZWwoZW50cnktPnByZXYsIGVudHJ5LT5uZXh0KTsKKwlJTklUX0xJU1RfSEVBRChlbnRyeSk7IAorfQorCisvKioKKyAqIGxpc3RfbW92ZSAtIGRlbGV0ZSBmcm9tIG9uZSBsaXN0IGFuZCBhZGQgYXMgYW5vdGhlcidzIGhlYWQKKyAqIEBsaXN0OiB0aGUgZW50cnkgdG8gbW92ZQorICogQGhlYWQ6IHRoZSBoZWFkIHRoYXQgd2lsbCBwcmVjZWRlIG91ciBlbnRyeQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9tb3ZlKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJX19saXN0X2RlbChsaXN0LT5wcmV2LCBsaXN0LT5uZXh0KTsKKwlsaXN0X2FkZChsaXN0LCBoZWFkKTsKK30KKworLyoqCisgKiBsaXN0X21vdmVfdGFpbCAtIGRlbGV0ZSBmcm9tIG9uZSBsaXN0IGFuZCBhZGQgYXMgYW5vdGhlcidzIHRhaWwKKyAqIEBsaXN0OiB0aGUgZW50cnkgdG8gbW92ZQorICogQGhlYWQ6IHRoZSBoZWFkIHRoYXQgd2lsbCBmb2xsb3cgb3VyIGVudHJ5CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X21vdmVfdGFpbChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAorCQkJCSAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlfX2xpc3RfZGVsKGxpc3QtPnByZXYsIGxpc3QtPm5leHQpOworCWxpc3RfYWRkX3RhaWwobGlzdCwgaGVhZCk7Cit9CisKKy8qKgorICogbGlzdF9lbXB0eSAtIHRlc3RzIHdoZXRoZXIgYSBsaXN0IGlzIGVtcHR5CisgKiBAaGVhZDogdGhlIGxpc3QgdG8gdGVzdC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbGlzdF9lbXB0eShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXJldHVybiBoZWFkLT5uZXh0ID09IGhlYWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2xpc3Rfc3BsaWNlKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCisJCQkJIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZmlyc3QgPSBsaXN0LT5uZXh0OworCXN0cnVjdCBsaXN0X2hlYWQgKmxhc3QgPSBsaXN0LT5wcmV2OworCXN0cnVjdCBsaXN0X2hlYWQgKmF0ID0gaGVhZC0+bmV4dDsKKworCWZpcnN0LT5wcmV2ID0gaGVhZDsKKwloZWFkLT5uZXh0ID0gZmlyc3Q7CisKKwlsYXN0LT5uZXh0ID0gYXQ7CisJYXQtPnByZXYgPSBsYXN0OworfQorCisvKioKKyAqIGxpc3Rfc3BsaWNlIC0gam9pbiB0d28gbGlzdHMKKyAqIEBsaXN0OiB0aGUgbmV3IGxpc3QgdG8gYWRkLgorICogQGhlYWQ6IHRoZSBwbGFjZSB0byBhZGQgaXQgaW4gdGhlIGZpcnN0IGxpc3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X3NwbGljZShzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCWlmICghbGlzdF9lbXB0eShsaXN0KSkKKwkJX19saXN0X3NwbGljZShsaXN0LCBoZWFkKTsKK30KKworLyoqCisgKiBsaXN0X3NwbGljZV9pbml0IC0gam9pbiB0d28gbGlzdHMgYW5kIHJlaW5pdGlhbGlzZSB0aGUgZW1wdGllZCBsaXN0LgorICogQGxpc3Q6IHRoZSBuZXcgbGlzdCB0byBhZGQuCisgKiBAaGVhZDogdGhlIHBsYWNlIHRvIGFkZCBpdCBpbiB0aGUgZmlyc3QgbGlzdC4KKyAqCisgKiBUaGUgbGlzdCBhdCBAbGlzdCBpcyByZWluaXRpYWxpc2VkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X3NwbGljZV9pbml0KHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCisJCQkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJaWYgKCFsaXN0X2VtcHR5KGxpc3QpKSB7CisJCV9fbGlzdF9zcGxpY2UobGlzdCwgaGVhZCk7CisJCUlOSVRfTElTVF9IRUFEKGxpc3QpOworCX0KK30KKworLyoqCisgKiBsaXN0X2VudHJ5IC0gZ2V0IHRoZSBzdHJ1Y3QgZm9yIHRoaXMgZW50cnkKKyAqIEBwdHI6CXRoZSAmc3RydWN0IGxpc3RfaGVhZCBwb2ludGVyLgorICogQHR5cGU6CXRoZSB0eXBlIG9mIHRoZSBzdHJ1Y3QgdGhpcyBpcyBlbWJlZGRlZCBpbi4KKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqLworI2RlZmluZSBsaXN0X2VudHJ5KHB0ciwgdHlwZSwgbWVtYmVyKSBcCisJY29udGFpbmVyX29mKHB0ciwgdHlwZSwgbWVtYmVyKQorCisvKioKKyAqIGxpc3RfZm9yX2VhY2gJLQlpdGVyYXRlIG92ZXIgYSBsaXN0CisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCisgKi8KKyNkZWZpbmUgbGlzdF9mb3JfZWFjaChwb3MsIGhlYWQpIFwKKwlmb3IgKHBvcyA9IChoZWFkKS0+bmV4dDsgcG9zICE9IChoZWFkKTsgXAorCQlwb3MgPSBwb3MtPm5leHQpCisKKy8qKgorICogX19saXN0X2Zvcl9lYWNoCS0JaXRlcmF0ZSBvdmVyIGEgbGlzdAorICogQHBvczoJdGhlICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgorICoKKyAqIFRoaXMgdmFyaWFudCBkaWZmZXJzIGZyb20gbGlzdF9mb3JfZWFjaCgpIGluIHRoYXQgaXQncyB0aGUKKyAqIHNpbXBsZXN0IHBvc3NpYmxlIGxpc3QgaXRlcmF0aW9uIGNvZGUuCisgKiBVc2UgdGhpcyBmb3IgY29kZSB0aGF0IGtub3dzIHRoZSBsaXN0IHRvIGJlIHZlcnkgc2hvcnQgKGVtcHR5CisgKiBvciAxIGVudHJ5KSBtb3N0IG9mIHRoZSB0aW1lLgorICovCisjZGVmaW5lIF9fbGlzdF9mb3JfZWFjaChwb3MsIGhlYWQpIFwKKwlmb3IgKHBvcyA9IChoZWFkKS0+bmV4dDsgcG9zICE9IChoZWFkKTsgcG9zID0gcG9zLT5uZXh0KQorCisvKioKKyAqIGxpc3RfZm9yX2VhY2hfcHJldgktCWl0ZXJhdGUgb3ZlciBhIGxpc3QgYmFja3dhcmRzCisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCisgKi8KKyNkZWZpbmUgbGlzdF9mb3JfZWFjaF9wcmV2KHBvcywgaGVhZCkgXAorCWZvciAocG9zID0gKGhlYWQpLT5wcmV2OyBwb3MgIT0gKGhlYWQpOyBwb3MgPSBwb3MtPnByZXYpCisKKy8qKgorICogbGlzdF9mb3JfZWFjaF9zYWZlCS0JaXRlcmF0ZSBvdmVyIGEgbGlzdCBzYWZlIGFnYWluc3QgcmVtb3ZhbCBvZiBsaXN0IGVudHJ5CisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogQG46CQlhbm90aGVyICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyB0ZW1wb3Jhcnkgc3RvcmFnZQorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCisgKi8KKyNkZWZpbmUgbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbiwgaGVhZCkgXAorCWZvciAocG9zID0gKGhlYWQpLT5uZXh0LCBuID0gcG9zLT5uZXh0OyBwb3MgIT0gKGhlYWQpOyBcCisJCXBvcyA9IG4sIG4gPSBwb3MtPm5leHQpCisKKy8qKgorICogbGlzdF9mb3JfZWFjaF9lbnRyeQktCWl0ZXJhdGUgb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUKKyAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKi8KKyNkZWZpbmUgbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsIGhlYWQsIG1lbWJlcikJCQkJXAorCWZvciAocG9zID0gbGlzdF9lbnRyeSgoaGVhZCktPm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKTsJXAorCSAgICAgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsgCQkJCQlcCisJICAgICBwb3MgPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSkKKworLyoqCisgKiBsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UgLSBpdGVyYXRlIGJhY2t3YXJkcyBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZS4KKyAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKi8KKyNkZWZpbmUgbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKHBvcywgaGVhZCwgbWVtYmVyKQkJCVwKKwlmb3IgKHBvcyA9IGxpc3RfZW50cnkoKGhlYWQpLT5wcmV2LCB0eXBlb2YoKnBvcyksIG1lbWJlcik7CVwKKwkgICAgICZwb3MtPm1lbWJlciAhPSAoaGVhZCk7IAkJCQkJXAorCSAgICAgcG9zID0gbGlzdF9lbnRyeShwb3MtPm1lbWJlci5wcmV2LCB0eXBlb2YoKnBvcyksIG1lbWJlcikpCisKKy8qKgorICogbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlIC0gaXRlcmF0ZSBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZSBzYWZlIGFnYWluc3QgcmVtb3ZhbCBvZiBsaXN0IGVudHJ5CisgKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIEBuOgkJYW5vdGhlciB0eXBlICogdG8gdXNlIGFzIHRlbXBvcmFyeSBzdG9yYWdlCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9zLCBuLCBoZWFkLCBtZW1iZXIpCQkJXAorCWZvciAocG9zID0gbGlzdF9lbnRyeSgoaGVhZCktPm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSwJXAorCQluID0gbGlzdF9lbnRyeShwb3MtPm1lbWJlci5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlcik7CVwKKwkgICAgICZwb3MtPm1lbWJlciAhPSAoaGVhZCk7IAkJCQkJXAorCSAgICAgcG9zID0gbiwgbiA9IGxpc3RfZW50cnkobi0+bWVtYmVyLm5leHQsIHR5cGVvZigqbiksIG1lbWJlcikpCisKKyNlbmRpZiAvKiBfTElTVF9IICovCmRpZmYgLS1naXQgYS9hbHNhY3RsL3N0YXRlLmMgYi9hbHNhY3RsL3N0YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThiNWJkMwotLS0gL2Rldi9udWxsCisrKyBiL2Fsc2FjdGwvc3RhdGUuYwpAQCAtMCwwICsxLDE3MzEgQEAKKy8qCisgKiAgQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlIENvbnRyb2wgUHJvZ3JhbQorICogIENvcHlyaWdodCAoYykgYnkgQWJyYW1vIEJhZ25hcmEgPGFicmFtb0BhbHNhLXByb2plY3Qub3JnPgorICogICAgICAgICAgICAgICAgICAgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSAiYWNvbmZpZy5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YWxzYS9hc291bmRsaWIuaD4KKyNpbmNsdWRlICJhbHNhY3RsLmgiCisKKworI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YgKGEpIC8gc2l6ZW9mIChhKVswXSkKKworCitzdGF0aWMgY2hhciAqaWRfc3RyKHNuZF9jdGxfZWxlbV9pZF90ICppZCkKK3sKKwlzdGF0aWMgY2hhciBzdHJbMTI4XTsKKwlhc3NlcnQoaWQpOworCXNwcmludGYoc3RyLCAiJWksJWksJWksJXMsJWkiLCAKKwkJc25kX2N0bF9lbGVtX2lkX2dldF9pbnRlcmZhY2UoaWQpLAorCQlzbmRfY3RsX2VsZW1faWRfZ2V0X2RldmljZShpZCksCisJCXNuZF9jdGxfZWxlbV9pZF9nZXRfc3ViZGV2aWNlKGlkKSwKKwkJc25kX2N0bF9lbGVtX2lkX2dldF9uYW1lKGlkKSwKKwkJc25kX2N0bF9lbGVtX2lkX2dldF9pbmRleChpZCkpOworCXJldHVybiBzdHI7Cit9CisKK3N0YXRpYyBjaGFyICpudW1fc3RyKGxvbmcgbikKK3sKKwlzdGF0aWMgY2hhciBzdHJbMzJdOworCXNwcmludGYoc3RyLCAiJWxkIiwgbik7CisJcmV0dXJuIHN0cjsKK30KKworc3RhdGljIGludCBzbmRfY29uZmlnX2ludGVnZXJfYWRkKHNuZF9jb25maWdfdCAqZmF0aGVyLCBjaGFyICppZCwgbG9uZyBpbnRlZ2VyKQoreworCWludCBlcnI7CisJc25kX2NvbmZpZ190ICpsZWFmOworCWVyciA9IHNuZF9jb25maWdfaW1ha2VfaW50ZWdlcigmbGVhZiwgaWQsIGludGVnZXIpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWVyciA9IHNuZF9jb25maWdfYWRkKGZhdGhlciwgbGVhZik7CisJaWYgKGVyciA8IDApIHsKKwkJc25kX2NvbmZpZ19kZWxldGUobGVhZik7CisJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9jb25maWdfaW50ZWdlcjY0X2FkZChzbmRfY29uZmlnX3QgKmZhdGhlciwgY2hhciAqaWQsIGxvbmcgbG9uZyBpbnRlZ2VyKQoreworCWludCBlcnI7CisJc25kX2NvbmZpZ190ICpsZWFmOworCWVyciA9IHNuZF9jb25maWdfaW1ha2VfaW50ZWdlcjY0KCZsZWFmLCBpZCwgaW50ZWdlcik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gc25kX2NvbmZpZ19hZGQoZmF0aGVyLCBsZWFmKTsKKwlpZiAoZXJyIDwgMCkgeworCQlzbmRfY29uZmlnX2RlbGV0ZShsZWFmKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NvbmZpZ19zdHJpbmdfYWRkKHNuZF9jb25maWdfdCAqZmF0aGVyLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqc3RyaW5nKQoreworCWludCBlcnI7CisJc25kX2NvbmZpZ190ICpsZWFmOworCWVyciA9IHNuZF9jb25maWdfaW1ha2Vfc3RyaW5nKCZsZWFmLCBpZCwgc3RyaW5nKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBzbmRfY29uZmlnX2FkZChmYXRoZXIsIGxlYWYpOworCWlmIChlcnIgPCAwKSB7CisJCXNuZF9jb25maWdfZGVsZXRlKGxlYWYpOworCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfY29uZmlnX2NvbXBvdW5kX2FkZChzbmRfY29uZmlnX3QgKmZhdGhlciwgY29uc3QgY2hhciAqaWQsIGludCBqb2luLAorCQkJCSAgIHNuZF9jb25maWdfdCAqKm5vZGUpCit7CisJaW50IGVycjsKKwlzbmRfY29uZmlnX3QgKmxlYWY7CisJZXJyID0gc25kX2NvbmZpZ19tYWtlX2NvbXBvdW5kKCZsZWFmLCBpZCwgam9pbik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gc25kX2NvbmZpZ19hZGQoZmF0aGVyLCBsZWFmKTsKKwlpZiAoZXJyIDwgMCkgeworCQlzbmRfY29uZmlnX2RlbGV0ZShsZWFmKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJKm5vZGUgPSBsZWFmOworCXJldHVybiAwOworfQorCisjZGVmaW5lIE1BWF9VU0VSX1RMVl9TSVpFCTY0CisKK3N0YXRpYyBjaGFyICp0bHZfdG9fc3RyKHVuc2lnbmVkIGludCAqdGx2KQoreworCWludCBpLCBsZW4gPSB0bHZbMV0gLyA0ICsgMjsKKwljaGFyICpzLCAqcDsKKworCWlmIChsZW4gPj0gTUFYX1VTRVJfVExWX1NJWkUpCisJCXJldHVybiBOVUxMOworCXMgPSBtYWxsb2MobGVuICogOCArIDEpOworCWlmICghIHMpCisJCXJldHVybiBOVUxMOworCXAgPSBzOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlzcHJpbnRmKHAsICIlMDh4IiwgdGx2W2ldKTsKKwkJcCArPSA4OworCX0KKwlyZXR1cm4gczsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCAqc3RyX3RvX3Rsdihjb25zdCBjaGFyICpzKQoreworCWludCBpLCBqLCBjLCBsZW47CisJdW5zaWduZWQgaW50ICp0bHY7CisJCQkKKwlsZW4gPSBzdHJsZW4ocyk7CisJaWYgKGxlbiAlIDgpIC8qIGFsaWduZWQgdG8gNCBieXRlcyAoPSA4IGxldHRlcnMpICovCisJCXJldHVybiBOVUxMOworCWxlbiAvPSA4OworCWlmIChsZW4gPiBNQVhfVVNFUl9UTFZfU0laRSkKKwkJcmV0dXJuIE5VTEw7CisJdGx2ID0gbWFsbG9jKHNpemVvZihpbnQpICogbGVuKTsKKwlpZiAoISB0bHYpCisJCXJldHVybiBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQl0bHZbaV0gPSAwOworCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisJCQlpZiAoKGMgPSBoZXh0b2RpZ2l0KCpzKyspKSA8IDApIHsKKwkJCQlmcmVlKHRsdik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQl0bHZbaV0gPSAodGx2W2ldIDw8IDQpIHwgYzsKKwkJfQorCX0KKwlyZXR1cm4gdGx2OworfQorCisvKgorICogYWRkIHRoZSBUTFYgc3RyaW5nLCBkQiByYW5nZXMsIGFuZCBkQiB2YWx1ZXMgdG8gY29tbWVudCBmaWVsZHMKKyAqLworc3RhdGljIGludCBhZGRfdGx2X2NvbW1lbnRzKHNuZF9jdGxfdCAqaGFuZGxlLCBzbmRfY3RsX2VsZW1faWRfdCAqaWQsCisJCQkgICAgc25kX2N0bF9lbGVtX2luZm9fdCAqaW5mbywgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKmN0bCwKKwkJCSAgICBzbmRfY29uZmlnX3QgKmNvbW1lbnQpCit7CisJdW5zaWduZWQgaW50IHRsdltNQVhfVVNFUl9UTFZfU0laRV07CisJdW5zaWduZWQgaW50ICpkYjsKKwlsb25nIHJhbmdlbWluLCByYW5nZW1heDsKKwlsb25nIGRibWluLCBkYm1heCwgZGJnYWluOworCXNuZF9jb25maWdfdCAqdmFsdWU7CisJdW5zaWduZWQgaW50IGksIGNvdW50OworCWludCBlcnI7CisKKwlpZiAoc25kX2N0bF9lbGVtX3Rsdl9yZWFkKGhhbmRsZSwgaWQsIHRsdiwgc2l6ZW9mKHRsdikpIDwgMCkKKwkJcmV0dXJuIDA7IC8qIGlnbm9yZSBlcnJvciAqLworCisJaWYgKHNuZF9jdGxfZWxlbV9pbmZvX2lzX3Rsdl93cml0YWJsZShpbmZvKSkgeworCQljaGFyICpzID0gdGx2X3RvX3N0cih0bHYpOworCQlpZiAocykgeworCQkJZXJyID0gc25kX2NvbmZpZ19zdHJpbmdfYWRkKGNvbW1lbnQsICJ0bHYiLCBzKTsKKwkJCWlmIChlcnIgPCAwKSB7CisJCQkJZXJyb3IoInNuZF9jb25maWdfc3RyaW5nX2FkZDogJXMiLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJCWZyZWUocyk7CisJCX0KKwl9CisKKwllcnIgPSBzbmRfdGx2X3BhcnNlX2RCX2luZm8odGx2LCBzaXplb2YodGx2KSwgJmRiKTsKKwlpZiAoZXJyIDw9IDApCisJCXJldHVybiAwOworCisJcmFuZ2VtaW4gPSBzbmRfY3RsX2VsZW1faW5mb19nZXRfbWluKGluZm8pOworCXJhbmdlbWF4ID0gc25kX2N0bF9lbGVtX2luZm9fZ2V0X21heChpbmZvKTsKKwlzbmRfdGx2X2dldF9kQl9yYW5nZShkYiwgcmFuZ2VtaW4sIHJhbmdlbWF4LCAmZGJtaW4sICZkYm1heCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJc25kX2NvbmZpZ19pbnRlZ2VyX2FkZChjb21tZW50LCAiZGJtaW4iLCBkYm1pbik7CisJc25kX2NvbmZpZ19pbnRlZ2VyX2FkZChjb21tZW50LCAiZGJtYXgiLCBkYm1heCk7CisKKwlpZiAoc25kX2N0bF9lbGVtX2luZm9fZ2V0X3R5cGUoaW5mbykgPT0gU05EX0NUTF9FTEVNX1RZUEVfSU5URUdFUikgeworCQllcnIgPSBzbmRfY29uZmlnX2NvbXBvdW5kX2FkZChjb21tZW50LCAiZGJ2YWx1ZSIsIDEsICZ2YWx1ZSk7CisJCWlmIChlcnIgPCAwKSB7CisJCQllcnJvcigic25kX2NvbmZpZ19jb21wb3VuZF9hZGQ6ICVzIiwgc25kX3N0cmVycm9yKGVycikpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQljb3VudCA9IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9jb3VudChpbmZvKTsKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCWVyciA9IHNuZF90bHZfY29udmVydF90b19kQihkYiwgcmFuZ2VtaW4sIHJhbmdlbWF4LAorCQkJCQlzbmRfY3RsX2VsZW1fdmFsdWVfZ2V0X2ludGVnZXIoY3RsLCBpKSwgJmRiZ2Fpbik7CisJCQlpZiAoZXJyIDwgMCkgeworCQkJCWVycm9yKCJzbmRfdGx2X2NvbnZlcnRfdG9fZEI6ICVzIiwgc25kX3N0cmVycm9yKGVycikpOworCQkJCXJldHVybiBlcnI7CisJCQl9CisJCQllcnIgPSBzbmRfY29uZmlnX2ludGVnZXJfYWRkKHZhbHVlLCBudW1fc3RyKGkpLCBkYmdhaW4pOworCQkJaWYgKGVyciA8IDApIHsKKwkJCQllcnJvcigic25kX2NvbmZpZ19pbnRlZ2VyX2FkZDogJXMiLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfY29udHJvbChzbmRfY3RsX3QgKmhhbmRsZSwgc25kX2N0bF9lbGVtX2lkX3QgKmlkLCBzbmRfY29uZmlnX3QgKnRvcCkKK3sKKwlzbmRfY3RsX2VsZW1fdmFsdWVfdCAqY3RsOworCXNuZF9jdGxfZWxlbV9pbmZvX3QgKmluZm87CisJc25kX2NvbmZpZ190ICpjb250cm9sLCAqY29tbWVudCwgKml0ZW0sICp2YWx1ZTsKKwljb25zdCBjaGFyICpzOworCWNoYXIgYnVmWzI1Nl07CisJdW5zaWduZWQgaW50IGlkeDsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGludCBkZXZpY2UsIHN1YmRldmljZSwgaW5kZXg7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzbmRfY3RsX2VsZW1fdHlwZV90IHR5cGU7CisJdW5zaWduZWQgaW50IGNvdW50OworCXNuZF9jdGxfZWxlbV92YWx1ZV9hbGxvY2EoJmN0bCk7CisJc25kX2N0bF9lbGVtX2luZm9fYWxsb2NhKCZpbmZvKTsKKwlzbmRfY3RsX2VsZW1faW5mb19zZXRfaWQoaW5mbywgaWQpOworCWVyciA9IHNuZF9jdGxfZWxlbV9pbmZvKGhhbmRsZSwgaW5mbyk7CisJaWYgKGVyciA8IDApIHsKKwkJZXJyb3IoIkNhbm5vdCByZWFkIGNvbnRyb2wgaW5mbyAnJXMnOiAlcyIsIGlkX3N0cihpZCksIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoIXNuZF9jdGxfZWxlbV9pbmZvX2lzX3JlYWRhYmxlKGluZm8pKQorCQlyZXR1cm4gMDsKKwlzbmRfY3RsX2VsZW1fdmFsdWVfc2V0X2lkKGN0bCwgaWQpOworCWVyciA9IHNuZF9jdGxfZWxlbV9yZWFkKGhhbmRsZSwgY3RsKTsKKwlpZiAoZXJyIDwgMCkgeworCQllcnJvcigiQ2Fubm90IHJlYWQgY29udHJvbCAnJXMnOiAlcyIsIGlkX3N0cihpZCksIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBzbmRfY29uZmlnX2NvbXBvdW5kX2FkZCh0b3AsIG51bV9zdHIoc25kX2N0bF9lbGVtX2luZm9fZ2V0X251bWlkKGluZm8pKSwgMCwgJmNvbnRyb2wpOworCWlmIChlcnIgPCAwKSB7CisJCWVycm9yKCJzbmRfY29uZmlnX2NvbXBvdW5kX2FkZDogJXMiLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybiBlcnI7CisJfQorCWVyciA9IHNuZF9jb25maWdfbWFrZV9jb21wb3VuZCgmY29tbWVudCwgImNvbW1lbnQiLCAwKTsKKwlpZiAoZXJyIDwgMCkgeworCQllcnJvcigic25kX2NvbmZpZ19tYWtlX2NvbXBvdW5kOiAlcyIsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlidWZbMF0gPSAnXDAnOworCWJ1ZlsxXSA9ICdcMCc7CisJaWYgKHNuZF9jdGxfZWxlbV9pbmZvX2lzX3JlYWRhYmxlKGluZm8pKQorCQlzdHJjYXQoYnVmLCAiIHJlYWQiKTsKKwlpZiAoc25kX2N0bF9lbGVtX2luZm9faXNfd3JpdGFibGUoaW5mbykpCisJCXN0cmNhdChidWYsICIgd3JpdGUiKTsKKwlpZiAoc25kX2N0bF9lbGVtX2luZm9faXNfaW5hY3RpdmUoaW5mbykpCisJCXN0cmNhdChidWYsICIgaW5hY3RpdmUiKTsKKwlpZiAoc25kX2N0bF9lbGVtX2luZm9faXNfdm9sYXRpbGUoaW5mbykpCisJCXN0cmNhdChidWYsICIgdm9sYXRpbGUiKTsKKwlpZiAoc25kX2N0bF9lbGVtX2luZm9faXNfbG9ja2VkKGluZm8pKQorCQlzdHJjYXQoYnVmLCAiIGxvY2tlZCIpOworCWlmIChzbmRfY3RsX2VsZW1faW5mb19pc191c2VyKGluZm8pKQorCQlzdHJjYXQoYnVmLCAiIHVzZXIiKTsKKwllcnIgPSBzbmRfY29uZmlnX3N0cmluZ19hZGQoY29tbWVudCwgImFjY2VzcyIsIGJ1ZiArIDEpOworCWlmIChlcnIgPCAwKSB7CisJCWVycm9yKCJzbmRfY29uZmlnX3N0cmluZ19hZGQ6ICVzIiwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gZXJyOworCX0KKworCXR5cGUgPSBzbmRfY3RsX2VsZW1faW5mb19nZXRfdHlwZShpbmZvKTsKKwlkZXZpY2UgPSBzbmRfY3RsX2VsZW1faW5mb19nZXRfZGV2aWNlKGluZm8pOworCXN1YmRldmljZSA9IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9zdWJkZXZpY2UoaW5mbyk7CisJaW5kZXggPSBzbmRfY3RsX2VsZW1faW5mb19nZXRfaW5kZXgoaW5mbyk7CisJbmFtZSA9IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9uYW1lKGluZm8pOworCWNvdW50ID0gc25kX2N0bF9lbGVtX2luZm9fZ2V0X2NvdW50KGluZm8pOworCXMgPSBzbmRfY3RsX2VsZW1fdHlwZV9uYW1lKHR5cGUpOworCWVyciA9IHNuZF9jb25maWdfc3RyaW5nX2FkZChjb21tZW50LCAidHlwZSIsIHMpOworCWlmIChlcnIgPCAwKSB7CisJCWVycm9yKCJzbmRfY29uZmlnX3N0cmluZ19hZGQ6ICVzIiwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gZXJyOworCX0KKwllcnIgPSBzbmRfY29uZmlnX2ludGVnZXJfYWRkKGNvbW1lbnQsICJjb3VudCIsIGNvdW50KTsKKwlpZiAoZXJyIDwgMCkgeworCQllcnJvcigic25kX2NvbmZpZ19pbnRlZ2VyX2FkZDogJXMiLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybiBlcnI7CisJfQorCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTTkRfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOgorCQlicmVhazsKKwljYXNlIFNORF9DVExfRUxFTV9UWVBFX0lOVEVHRVI6CisJeworCQlsb25nIG1pbiA9IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9taW4oaW5mbyk7CisJCWxvbmcgbWF4ID0gc25kX2N0bF9lbGVtX2luZm9fZ2V0X21heChpbmZvKTsKKwkJbG9uZyBzdGVwID0gc25kX2N0bF9lbGVtX2luZm9fZ2V0X3N0ZXAoaW5mbyk7CisJCWlmIChzdGVwKQorCQkJc3ByaW50ZihidWYsICIlbGkgLSAlbGkgKHN0ZXAgJWxpKSIsIG1pbiwgbWF4LCBzdGVwKTsKKwkJZWxzZQorCQkJc3ByaW50ZihidWYsICIlbGkgLSAlbGkiLCBtaW4sIG1heCk7CisJCWVyciA9IHNuZF9jb25maWdfc3RyaW5nX2FkZChjb21tZW50LCAicmFuZ2UiLCBidWYpOworCQlpZiAoZXJyIDwgMCkgeworCQkJZXJyb3IoInNuZF9jb25maWdfc3RyaW5nX2FkZDogJXMiLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWlmIChzbmRfY3RsX2VsZW1faW5mb19pc190bHZfcmVhZGFibGUoaW5mbykpIHsKKwkJCWVyciA9IGFkZF90bHZfY29tbWVudHMoaGFuZGxlLCBpZCwgaW5mbywgY3RsLCBjb21tZW50KTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgU05EX0NUTF9FTEVNX1RZUEVfSU5URUdFUjY0OgorCXsKKwkJbG9uZyBsb25nIG1pbiA9IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9taW42NChpbmZvKTsKKwkJbG9uZyBsb25nIG1heCA9IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9tYXg2NChpbmZvKTsKKwkJbG9uZyBsb25nIHN0ZXAgPSBzbmRfY3RsX2VsZW1faW5mb19nZXRfc3RlcDY0KGluZm8pOworCQlpZiAoc3RlcCkKKwkJCXNwcmludGYoYnVmLCAiJUxpIC0gJUxpIChzdGVwICVMaSkiLCBtaW4sIG1heCwgc3RlcCk7CisJCWVsc2UKKwkJCXNwcmludGYoYnVmLCAiJUxpIC0gJUxpIiwgbWluLCBtYXgpOworCQllcnIgPSBzbmRfY29uZmlnX3N0cmluZ19hZGQoY29tbWVudCwgInJhbmdlIiwgYnVmKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWVycm9yKCJzbmRfY29uZmlnX3N0cmluZ19hZGQ6ICVzIiwgc25kX3N0cmVycm9yKGVycikpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBTTkRfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOgorCXsKKwkJdW5zaWduZWQgaW50IGl0ZW1zOworCQllcnIgPSBzbmRfY29uZmlnX2NvbXBvdW5kX2FkZChjb21tZW50LCAiaXRlbSIsIDEsICZpdGVtKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWVycm9yKCJzbmRfY29uZmlnX2NvbXBvdW5kX2FkZDogJXMiLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWl0ZW1zID0gc25kX2N0bF9lbGVtX2luZm9fZ2V0X2l0ZW1zKGluZm8pOworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IGl0ZW1zOyBpZHgrKykgeworCQkJc25kX2N0bF9lbGVtX2luZm9fc2V0X2l0ZW0oaW5mbywgaWR4KTsKKwkJCWVyciA9IHNuZF9jdGxfZWxlbV9pbmZvKGhhbmRsZSwgaW5mbyk7CisJCQlpZiAoZXJyIDwgMCkgeworCQkJCWVycm9yKCJzbmRfY3RsX2NhcmRfaW5mbzogJXMiLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJCWVyciA9IHNuZF9jb25maWdfc3RyaW5nX2FkZChpdGVtLCBudW1fc3RyKGlkeCksIHNuZF9jdGxfZWxlbV9pbmZvX2dldF9pdGVtX25hbWUoaW5mbykpOworCQkJaWYgKGVyciA8IDApIHsKKwkJCQllcnJvcigic25kX2NvbmZpZ19zdHJpbmdfYWRkOiAlcyIsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcyA9IHNuZF9jdGxfZWxlbV9pZmFjZV9uYW1lKHNuZF9jdGxfZWxlbV9pbmZvX2dldF9pbnRlcmZhY2UoaW5mbykpOworCWVyciA9IHNuZF9jb25maWdfc3RyaW5nX2FkZChjb250cm9sLCAiaWZhY2UiLCBzKTsKKwlpZiAoZXJyIDwgMCkgeworCQllcnJvcigic25kX2NvbmZpZ19zdHJpbmdfYWRkOiAlcyIsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKGRldmljZSAhPSAwKSB7CisJCWVyciA9IHNuZF9jb25maWdfaW50ZWdlcl9hZGQoY29udHJvbCwgImRldmljZSIsIGRldmljZSk7CisJCWlmIChlcnIgPCAwKSB7CisJCQllcnJvcigic25kX2NvbmZpZ19pbnRlZ2VyX2FkZDogJXMiLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCWlmIChzdWJkZXZpY2UgIT0gMCkgeworCQllcnIgPSBzbmRfY29uZmlnX2ludGVnZXJfYWRkKGNvbnRyb2wsICJzdWJkZXZpY2UiLCBzdWJkZXZpY2UpOworCQlpZiAoZXJyIDwgMCkgeworCQkJZXJyb3IoInNuZF9jb25maWdfaW50ZWdlcl9hZGQ6ICVzIiwgc25kX3N0cmVycm9yKGVycikpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKwllcnIgPSBzbmRfY29uZmlnX3N0cmluZ19hZGQoY29udHJvbCwgIm5hbWUiLCBuYW1lKTsKKwlpZiAoZXJyIDwgMCkgeworCQllcnJvcigic25kX2NvbmZpZ19zdHJpbmdfYWRkOiAlcyIsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKGluZGV4ICE9IDApIHsKKwkJZXJyID0gc25kX2NvbmZpZ19pbnRlZ2VyX2FkZChjb250cm9sLCAiaW5kZXgiLCBpbmRleCk7CisJCWlmIChlcnIgPCAwKSB7CisJCQllcnJvcigic25kX2NvbmZpZ19pbnRlZ2VyX2FkZDogJXMiLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTTkRfQ1RMX0VMRU1fVFlQRV9CWVRFUzoKKwljYXNlIFNORF9DVExfRUxFTV9UWVBFX0lFQzk1ODoKKwl7CisJCXNpemVfdCBzaXplID0gdHlwZSA9PSBTTkRfQ1RMX0VMRU1fVFlQRV9CWVRFUyA/CisJCQljb3VudCA6IHNpemVvZihzbmRfYWVzX2llYzk1OF90KTsKKwkJY2hhciBidWZbc2l6ZSAqIDIgKyAxXTsKKwkJY2hhciAqcCA9IGJ1ZjsKKwkJY2hhciAqaGV4ID0gIjAxMjM0NTY3ODlhYmNkZWYiOworCQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IAorCQkgIChjb25zdCB1bnNpZ25lZCBjaGFyICopc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9ieXRlcyhjdGwpOworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IHNpemU7IGlkeCsrKSB7CisJCQlpbnQgdiA9IGJ5dGVzW2lkeF07CisJCQkqcCsrID0gaGV4W3YgPj4gNF07CisJCQkqcCsrID0gaGV4W3YgJiAweDBmXTsKKwkJfQorCQkqcCA9ICdcMCc7CisJCWVyciA9IHNuZF9jb25maWdfc3RyaW5nX2FkZChjb250cm9sLCAidmFsdWUiLCBidWYpOworCQlpZiAoZXJyIDwgMCkgeworCQkJZXJyb3IoInNuZF9jb25maWdfc3RyaW5nX2FkZDogJXMiLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWdvdG8gZmluaXNoOworCX0KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZiAoY291bnQgPT0gMSkgeworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBTTkRfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOgorCQkJZXJyID0gc25kX2NvbmZpZ19zdHJpbmdfYWRkKGNvbnRyb2wsICJ2YWx1ZSIsIHNuZF9jdGxfZWxlbV92YWx1ZV9nZXRfYm9vbGVhbihjdGwsIDApID8gInRydWUiIDogImZhbHNlIik7CisJCQlpZiAoZXJyIDwgMCkgeworCQkJCWVycm9yKCJzbmRfY29uZmlnX3N0cmluZ19hZGQ6ICVzIiwgc25kX3N0cmVycm9yKGVycikpOworCQkJCXJldHVybiBlcnI7CisJCQl9CisJCQlnb3RvIGZpbmlzaDsKKwkJY2FzZSBTTkRfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOgorCQkJZXJyID0gc25kX2NvbmZpZ19pbnRlZ2VyX2FkZChjb250cm9sLCAidmFsdWUiLCBzbmRfY3RsX2VsZW1fdmFsdWVfZ2V0X2ludGVnZXIoY3RsLCAwKSk7CisJCQlpZiAoZXJyIDwgMCkgeworCQkJCWVycm9yKCJzbmRfY29uZmlnX2ludGVnZXJfYWRkOiAlcyIsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQorCQkJZ290byBmaW5pc2g7CisJCWNhc2UgU05EX0NUTF9FTEVNX1RZUEVfSU5URUdFUjY0OgorCQkJZXJyID0gc25kX2NvbmZpZ19pbnRlZ2VyNjRfYWRkKGNvbnRyb2wsICJ2YWx1ZSIsIHNuZF9jdGxfZWxlbV92YWx1ZV9nZXRfaW50ZWdlcjY0KGN0bCwgMCkpOworCQkJaWYgKGVyciA8IDApIHsKKwkJCQllcnJvcigic25kX2NvbmZpZ19pbnRlZ2VyNjRfYWRkOiAlcyIsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQorCQkJZ290byBmaW5pc2g7CisJCWNhc2UgU05EX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDoKKwkJeworCQkJdW5zaWduZWQgaW50IHYgPSBzbmRfY3RsX2VsZW1fdmFsdWVfZ2V0X2VudW1lcmF0ZWQoY3RsLCAwKTsKKwkJCXNuZF9jb25maWdfdCAqYzsKKwkJCWVyciA9IHNuZF9jb25maWdfc2VhcmNoKGl0ZW0sIG51bV9zdHIodiksICZjKTsKKwkJCWlmIChlcnIgPT0gMCkgeworCQkJCWVyciA9IHNuZF9jb25maWdfZ2V0X3N0cmluZyhjLCAmcyk7CisJCQkJYXNzZXJ0KGVyciA9PSAwKTsKKwkJCQllcnIgPSBzbmRfY29uZmlnX3N0cmluZ19hZGQoY29udHJvbCwgInZhbHVlIiwgcyk7CisJCQl9IGVsc2UgeworCQkJCWVyciA9IHNuZF9jb25maWdfaW50ZWdlcl9hZGQoY29udHJvbCwgInZhbHVlIiwgdik7CisJCQl9CisJCQlpZiAoZXJyIDwgMCkKKwkJCQllcnJvcigic25kX2NvbmZpZyBhZGQ6ICVzIiwgc25kX3N0cmVycm9yKGVycikpOworCQkJZ290byBmaW5pc2g7CisJCX0KKwkJZGVmYXVsdDoKKwkJCWVycm9yKCJVbmtub3duIGNvbnRyb2wgdHlwZTogJWRcbiIsIHR5cGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwllcnIgPSBzbmRfY29uZmlnX2NvbXBvdW5kX2FkZChjb250cm9sLCAidmFsdWUiLCAxLCAmdmFsdWUpOworCWlmIChlcnIgPCAwKSB7CisJCWVycm9yKCJzbmRfY29uZmlnX2NvbXBvdW5kX2FkZDogJXMiLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybiBlcnI7CisJfQorCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTTkRfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOgorCQlmb3IgKGlkeCA9IDA7IGlkeCA8IGNvdW50OyBpZHgrKykgeworCQkJZXJyID0gc25kX2NvbmZpZ19zdHJpbmdfYWRkKHZhbHVlLCBudW1fc3RyKGlkeCksIHNuZF9jdGxfZWxlbV92YWx1ZV9nZXRfYm9vbGVhbihjdGwsIGlkeCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKwkJCWlmIChlcnIgPCAwKSB7CisJCQkJZXJyb3IoInNuZF9jb25maWdfc3RyaW5nX2FkZDogJXMiLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIFNORF9DVExfRUxFTV9UWVBFX0lOVEVHRVI6CisJCWZvciAoaWR4ID0gMDsgaWR4IDwgY291bnQ7IGlkeCsrKSB7CisJCQllcnIgPSBzbmRfY29uZmlnX2ludGVnZXJfYWRkKHZhbHVlLCBudW1fc3RyKGlkeCksIHNuZF9jdGxfZWxlbV92YWx1ZV9nZXRfaW50ZWdlcihjdGwsIGlkeCkpOworCQkJaWYgKGVyciA8IDApIHsKKwkJCQllcnJvcigic25kX2NvbmZpZ19pbnRlZ2VyX2FkZDogJXMiLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIFNORF9DVExfRUxFTV9UWVBFX0lOVEVHRVI2NDoKKwkJZm9yIChpZHggPSAwOyBpZHggPCBjb3VudDsgaWR4KyspIHsKKwkJCWVyciA9IHNuZF9jb25maWdfaW50ZWdlcjY0X2FkZCh2YWx1ZSwgbnVtX3N0cihpZHgpLCBzbmRfY3RsX2VsZW1fdmFsdWVfZ2V0X2ludGVnZXI2NChjdGwsIGlkeCkpOworCQkJaWYgKGVyciA8IDApIHsKKwkJCQllcnJvcigic25kX2NvbmZpZ19pbnRlZ2VyNjRfYWRkOiAlcyIsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgU05EX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDoKKwkJZm9yIChpZHggPSAwOyBpZHggPCBjb3VudDsgaWR4KyspIHsKKwkJCXVuc2lnbmVkIGludCB2ID0gc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9lbnVtZXJhdGVkKGN0bCwgaWR4KTsKKwkJCXNuZF9jb25maWdfdCAqYzsKKwkJCWVyciA9IHNuZF9jb25maWdfc2VhcmNoKGl0ZW0sIG51bV9zdHIodiksICZjKTsKKwkJCWlmIChlcnIgPT0gMCkgeworCQkJCWVyciA9IHNuZF9jb25maWdfZ2V0X3N0cmluZyhjLCAmcyk7CisJCQkJYXNzZXJ0KGVyciA9PSAwKTsKKwkJCQllcnIgPSBzbmRfY29uZmlnX3N0cmluZ19hZGQodmFsdWUsIG51bV9zdHIoaWR4KSwgcyk7CisJCQl9IGVsc2UgeworCQkJCWVyciA9IHNuZF9jb25maWdfaW50ZWdlcl9hZGQodmFsdWUsIG51bV9zdHIoaWR4KSwgdik7CisJCQl9CisJCQlpZiAoZXJyIDwgMCkgeworCQkJCWVycm9yKCJzbmRfY29uZmlnIGFkZDogJXMiLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnJvcigiVW5rbm93biBjb250cm9sIHR5cGU6ICVkXG4iLCB0eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCQorZmluaXNoOgorCWVyciA9IHNuZF9jb25maWdfYWRkKGNvbnRyb2wsIGNvbW1lbnQpOworCWlmIChlcnIgPCAwKSB7CisJCWVycm9yKCJzbmRfY29uZmlnX2FkZDogJXMiLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCQorc3RhdGljIGludCBnZXRfY29udHJvbHMoaW50IGNhcmRubywgc25kX2NvbmZpZ190ICp0b3ApCit7CisJc25kX2N0bF90ICpoYW5kbGU7CisJc25kX2N0bF9jYXJkX2luZm9fdCAqaW5mbzsKKwlzbmRfY29uZmlnX3QgKnN0YXRlLCAqY2FyZCwgKmNvbnRyb2w7CisJc25kX2N0bF9lbGVtX2xpc3RfdCAqbGlzdDsKKwlzbmRfY3RsX2VsZW1faWRfdCAqZWxlbV9pZDsKKwl1bnNpZ25lZCBpbnQgaWR4OworCWludCBlcnI7CisJY2hhciBuYW1lWzMyXTsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJY29uc3QgY2hhciAqaWQ7CisJc25kX2N0bF9jYXJkX2luZm9fYWxsb2NhKCZpbmZvKTsKKwlzbmRfY3RsX2VsZW1fbGlzdF9hbGxvY2EoJmxpc3QpOworCXNuZF9jdGxfZWxlbV9pZF9hbGxvY2EoJmVsZW1faWQpOworCisJc3ByaW50ZihuYW1lLCAiaHc6JWQiLCBjYXJkbm8pOworCWVyciA9IHNuZF9jdGxfb3BlbigmaGFuZGxlLCBuYW1lLCBTTkRfQ1RMX1JFQURPTkxZKTsKKwlpZiAoZXJyIDwgMCkgeworCQllcnJvcigic25kX2N0bF9vcGVuIGVycm9yOiAlcyIsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJZXJyID0gc25kX2N0bF9jYXJkX2luZm8oaGFuZGxlLCBpbmZvKTsKKwlpZiAoZXJyIDwgMCkgeworCQllcnJvcigic25kX2N0bF9jYXJkX2luZm8gZXJyb3I6ICVzIiwgc25kX3N0cmVycm9yKGVycikpOworCQlnb3RvIF9jbG9zZTsKKwl9CisJaWQgPSBzbmRfY3RsX2NhcmRfaW5mb19nZXRfaWQoaW5mbyk7CisJZXJyID0gc25kX2NvbmZpZ19zZWFyY2godG9wLCAic3RhdGUiLCAmc3RhdGUpOworCWlmIChlcnIgPT0gMCAmJgorCSAgICBzbmRfY29uZmlnX2dldF90eXBlKHN0YXRlKSAhPSBTTkRfQ09ORklHX1RZUEVfQ09NUE9VTkQpIHsKKwkJZXJyb3IoImNvbmZpZyBzdGF0ZSBub2RlIGlzIG5vdCBhIGNvbXBvdW5kIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gX2Nsb3NlOworCX0KKwlpZiAoZXJyIDwgMCkgeworCQllcnIgPSBzbmRfY29uZmlnX2NvbXBvdW5kX2FkZCh0b3AsICJzdGF0ZSIsIDEsICZzdGF0ZSk7CisJCWlmIChlcnIgPCAwKSB7CisJCQllcnJvcigic25kX2NvbmZpZ19jb21wb3VuZF9hZGQ6ICVzIiwgc25kX3N0cmVycm9yKGVycikpOworCQkJZ290byBfY2xvc2U7CisJCX0KKwl9CisJZXJyID0gc25kX2NvbmZpZ19zZWFyY2goc3RhdGUsIGlkLCAmY2FyZCk7CisJaWYgKGVyciA9PSAwICYmCisJICAgIHNuZF9jb25maWdfZ2V0X3R5cGUoY2FyZCkgIT0gU05EX0NPTkZJR19UWVBFX0NPTVBPVU5EKSB7CisJCWVycm9yKCJjb25maWcgc3RhdGUuJXMgbm9kZSBpcyBub3QgYSBjb21wb3VuZCIsIGlkKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBfY2xvc2U7CisJfQorCWlmIChlcnIgPCAwKSB7CisJCWVyciA9IHNuZF9jb25maWdfY29tcG91bmRfYWRkKHN0YXRlLCBpZCwgMCwgJmNhcmQpOworCQlpZiAoZXJyIDwgMCkgeworCQkJZXJyb3IoInNuZF9jb25maWdfY29tcG91bmRfYWRkOiAlcyIsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJCWdvdG8gX2Nsb3NlOworCQl9CisJfQorCWVyciA9IHNuZF9jb25maWdfc2VhcmNoKGNhcmQsICJjb250cm9sIiwgJmNvbnRyb2wpOworCWlmIChlcnIgPT0gMCkgeworCQllcnIgPSBzbmRfY29uZmlnX2RlbGV0ZShjb250cm9sKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWVycm9yKCJzbmRfY29uZmlnX2RlbGV0ZTogJXMiLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQlnb3RvIF9jbG9zZTsKKwkJfQorCX0KKwllcnIgPSBzbmRfY3RsX2VsZW1fbGlzdChoYW5kbGUsIGxpc3QpOworCWlmIChlcnIgPCAwKSB7CisJCWVycm9yKCJDYW5ub3QgZGV0ZXJtaW5lIGNvbnRyb2xzOiAlcyIsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJZ290byBfY2xvc2U7CisJfQorCWNvdW50ID0gc25kX2N0bF9lbGVtX2xpc3RfZ2V0X2NvdW50KGxpc3QpOworCWVyciA9IHNuZF9jb25maWdfY29tcG91bmRfYWRkKGNhcmQsICJjb250cm9sIiwgY291bnQgPiAwLCAmY29udHJvbCk7CisJaWYgKGVyciA8IDApIHsKKwkJZXJyb3IoInNuZF9jb25maWdfY29tcG91bmRfYWRkOiAlcyIsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJZ290byBfY2xvc2U7CisJfQorCWlmIChjb3VudCA9PSAwKSB7CisJCWVyciA9IDA7CisJCWdvdG8gX2Nsb3NlOworCX0KKwlzbmRfY3RsX2VsZW1fbGlzdF9zZXRfb2Zmc2V0KGxpc3QsIDApOworCWlmIChzbmRfY3RsX2VsZW1fbGlzdF9hbGxvY19zcGFjZShsaXN0LCBjb3VudCkgPCAwKSB7CisJCWVycm9yKCJObyBlbm91Z2ggbWVtb3J5Li4uIik7CisJCWdvdG8gX2Nsb3NlOworCX0KKwlpZiAoKGVyciA9IHNuZF9jdGxfZWxlbV9saXN0KGhhbmRsZSwgbGlzdCkpIDwgMCkgeworCQllcnJvcigiQ2Fubm90IGRldGVybWluZSBjb250cm9scyAoMik6ICVzIiwgc25kX3N0cmVycm9yKGVycikpOworCQlnb3RvIF9mcmVlOworCX0KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IGNvdW50OyArK2lkeCkgeworCQlzbmRfY3RsX2VsZW1fbGlzdF9nZXRfaWQobGlzdCwgaWR4LCBlbGVtX2lkKTsKKwkJZXJyID0gZ2V0X2NvbnRyb2woaGFuZGxlLCBlbGVtX2lkLCBjb250cm9sKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIF9mcmVlOworCX0JCQorCQkKKwllcnIgPSAwOworIF9mcmVlOgorCXNuZF9jdGxfZWxlbV9saXN0X2ZyZWVfc3BhY2UobGlzdCk7CisgX2Nsb3NlOgorCXNuZF9jdGxfY2xvc2UoaGFuZGxlKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgbG9uZyBjb25maWdfaWZhY2Uoc25kX2NvbmZpZ190ICpuKQoreworCWxvbmcgaTsKKwlsb25nIGxvbmcgbGk7CisJc25kX2N0bF9lbGVtX2lmYWNlX3QgaWR4OyAKKwljb25zdCBjaGFyICpzdHI7CisJc3dpdGNoIChzbmRfY29uZmlnX2dldF90eXBlKG4pKSB7CisJY2FzZSBTTkRfQ09ORklHX1RZUEVfSU5URUdFUjoKKwkJc25kX2NvbmZpZ19nZXRfaW50ZWdlcihuLCAmaSk7CisJCXJldHVybiBpOworCWNhc2UgU05EX0NPTkZJR19UWVBFX0lOVEVHRVI2NDoKKwkJc25kX2NvbmZpZ19nZXRfaW50ZWdlcjY0KG4sICZsaSk7CisJCXJldHVybiBsaTsKKwljYXNlIFNORF9DT05GSUdfVFlQRV9TVFJJTkc6CisJCXNuZF9jb25maWdfZ2V0X3N0cmluZyhuLCAmc3RyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KKwlmb3IgKGlkeCA9IDA7IGlkeCA8PSBTTkRfQ1RMX0VMRU1fSUZBQ0VfTEFTVDsgaWR4KyspIHsKKwkJaWYgKHN0cmNhc2VjbXAoc25kX2N0bF9lbGVtX2lmYWNlX25hbWUoaWR4KSwgc3RyKSA9PSAwKQorCQkJcmV0dXJuIGlkeDsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19ib29sKHNuZF9jb25maWdfdCAqbiwgaW50IGRvaXQpCit7CisJY29uc3QgY2hhciAqc3RyOworCWxvbmcgdmFsOworCWxvbmcgbG9uZyBsdmFsOworCisJc3dpdGNoIChzbmRfY29uZmlnX2dldF90eXBlKG4pKSB7CisJY2FzZSBTTkRfQ09ORklHX1RZUEVfSU5URUdFUjoKKwkJc25kX2NvbmZpZ19nZXRfaW50ZWdlcihuLCAmdmFsKTsKKwkJaWYgKHZhbCA8IDAgfHwgdmFsID4gMSkKKwkJCXJldHVybiAtMTsKKwkJcmV0dXJuIHZhbDsKKwljYXNlIFNORF9DT05GSUdfVFlQRV9JTlRFR0VSNjQ6CisJCXNuZF9jb25maWdfZ2V0X2ludGVnZXI2NChuLCAmbHZhbCk7CisJCWlmIChsdmFsIDwgMCB8fCBsdmFsID4gMSkKKwkJCXJldHVybiAtMTsKKwkJcmV0dXJuIChpbnQpIGx2YWw7CisJY2FzZSBTTkRfQ09ORklHX1RZUEVfU1RSSU5HOgorCQlzbmRfY29uZmlnX2dldF9zdHJpbmcobiwgJnN0cik7CisJCWJyZWFrOworCWNhc2UgU05EX0NPTkZJR19UWVBFX0NPTVBPVU5EOgorCQlpZiAoIWZvcmNlX3Jlc3RvcmUgfHwgIWRvaXQpCisJCQlyZXR1cm4gLTE7CisJCW4gPSBzbmRfY29uZmlnX2l0ZXJhdG9yX2VudHJ5KHNuZF9jb25maWdfaXRlcmF0b3JfZmlyc3QobikpOworCQlyZXR1cm4gY29uZmlnX2Jvb2wobiwgZG9pdCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoc3RyY21wKHN0ciwgIm9uIikgPT0gMCB8fCBzdHJjbXAoc3RyLCAidHJ1ZSIpID09IDApCisJCXJldHVybiAxOworCWlmIChzdHJjbXAoc3RyLCAib2ZmIikgPT0gMCB8fCBzdHJjbXAoc3RyLCAiZmFsc2UiKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2VudW1lcmF0ZWQoc25kX2NvbmZpZ190ICpuLCBzbmRfY3RsX3QgKmhhbmRsZSwKKwkJCSAgICAgc25kX2N0bF9lbGVtX2luZm9fdCAqaW5mbywgaW50IGRvaXQpCit7CisJY29uc3QgY2hhciAqc3RyOworCWxvbmcgdmFsOworCWxvbmcgbG9uZyBsdmFsOworCXVuc2lnbmVkIGludCBpZHgsIGl0ZW1zOworCisJc3dpdGNoIChzbmRfY29uZmlnX2dldF90eXBlKG4pKSB7CisJY2FzZSBTTkRfQ09ORklHX1RZUEVfSU5URUdFUjoKKwkJc25kX2NvbmZpZ19nZXRfaW50ZWdlcihuLCAmdmFsKTsKKwkJcmV0dXJuIHZhbDsKKwljYXNlIFNORF9DT05GSUdfVFlQRV9JTlRFR0VSNjQ6CisJCXNuZF9jb25maWdfZ2V0X2ludGVnZXI2NChuLCAmbHZhbCk7CisJCXJldHVybiAoaW50KSBsdmFsOworCWNhc2UgU05EX0NPTkZJR19UWVBFX1NUUklORzoKKwkJc25kX2NvbmZpZ19nZXRfc3RyaW5nKG4sICZzdHIpOworCQlicmVhazsKKwljYXNlIFNORF9DT05GSUdfVFlQRV9DT01QT1VORDoKKwkJaWYgKCFmb3JjZV9yZXN0b3JlIHx8ICFkb2l0KQorCQkJcmV0dXJuIC0xOworCQluID0gc25kX2NvbmZpZ19pdGVyYXRvcl9lbnRyeShzbmRfY29uZmlnX2l0ZXJhdG9yX2ZpcnN0KG4pKTsKKwkJcmV0dXJuIGNvbmZpZ19lbnVtZXJhdGVkKG4sIGhhbmRsZSwgaW5mbywgZG9pdCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KKwlpdGVtcyA9IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9pdGVtcyhpbmZvKTsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IGl0ZW1zOyBpZHgrKykgeworCQlpbnQgZXJyOworCQlzbmRfY3RsX2VsZW1faW5mb19zZXRfaXRlbShpbmZvLCBpZHgpOworCQllcnIgPSBzbmRfY3RsX2VsZW1faW5mbyhoYW5kbGUsIGluZm8pOworCQlpZiAoZXJyIDwgMCkgeworCQkJZXJyb3IoInNuZF9jdGxfZWxlbV9pbmZvOiAlcyIsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJaWYgKHN0cmNtcChzdHIsIHNuZF9jdGxfZWxlbV9pbmZvX2dldF9pdGVtX25hbWUoaW5mbykpID09IDApCisJCQlyZXR1cm4gaWR4OworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2ludGVnZXIoc25kX2NvbmZpZ190ICpuLCBsb25nICp2YWwsIGludCBkb2l0KQoreworCWludCBlcnIgPSBzbmRfY29uZmlnX2dldF9pbnRlZ2VyKG4sIHZhbCk7CisJaWYgKGVyciA8IDAgJiYgZm9yY2VfcmVzdG9yZSAmJiBkb2l0KSB7CisJCWlmIChzbmRfY29uZmlnX2dldF90eXBlKG4pICE9IFNORF9DT05GSUdfVFlQRV9DT01QT1VORCkKKwkJCXJldHVybiBlcnI7CisJCW4gPSBzbmRfY29uZmlnX2l0ZXJhdG9yX2VudHJ5KHNuZF9jb25maWdfaXRlcmF0b3JfZmlyc3QobikpOworCQlyZXR1cm4gY29uZmlnX2ludGVnZXIobiwgdmFsLCBkb2l0KTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBjb25maWdfaW50ZWdlcjY0KHNuZF9jb25maWdfdCAqbiwgbG9uZyBsb25nICp2YWwsIGludCBkb2l0KQoreworCWludCBlcnIgPSBzbmRfY29uZmlnX2dldF9pbnRlZ2VyNjQobiwgdmFsKTsKKwlpZiAoZXJyIDwgMCAmJiBmb3JjZV9yZXN0b3JlICYmIGRvaXQpIHsKKwkJaWYgKHNuZF9jb25maWdfZ2V0X3R5cGUobikgIT0gU05EX0NPTkZJR19UWVBFX0NPTVBPVU5EKQorCQkJcmV0dXJuIGVycjsKKwkJbiA9IHNuZF9jb25maWdfaXRlcmF0b3JfZW50cnkoc25kX2NvbmZpZ19pdGVyYXRvcl9maXJzdChuKSk7CisJCXJldHVybiBjb25maWdfaW50ZWdlcjY0KG4sIHZhbCwgZG9pdCk7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfY29tbWVudF9hY2Nlc3Moc25kX2NvbmZpZ190ICpjb25mLCBjb25zdCBjaGFyICpzdHIpCit7CisJc25kX2NvbmZpZ19pdGVyYXRvcl90IGksIG5leHQ7CisKKwlzbmRfY29uZmlnX2Zvcl9lYWNoKGksIG5leHQsIGNvbmYpIHsKKwkJc25kX2NvbmZpZ190ICpuID0gc25kX2NvbmZpZ19pdGVyYXRvcl9lbnRyeShpKTsKKwkJY29uc3QgY2hhciAqaWQsICpzOworCQlpZiAoc25kX2NvbmZpZ19nZXRfaWQobiwgJmlkKSA8IDApCisJCQljb250aW51ZTsKKwkJaWYgKHN0cmNtcChpZCwgImFjY2VzcyIpID09IDApIHsKKwkJCWlmIChzbmRfY29uZmlnX2dldF9zdHJpbmcobiwgJnMpIDwgMCkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChzdHJzdHIocywgc3RyKSkKKwkJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGdldCB0aGUgaXRlbSB0eXBlIGZyb20gdGhlIGdpdmVuIGNvbW1lbnQgY29uZmlnCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2NvbW1lbnRfdHlwZShzbmRfY29uZmlnX3QgKm4pCit7CisJc3RhdGljIGNvbnN0IHNuZF9jdGxfZWxlbV90eXBlX3QgdHlwZXNbXSA9IHsKKwkJU05EX0NUTF9FTEVNX1RZUEVfQk9PTEVBTiwKKwkJU05EX0NUTF9FTEVNX1RZUEVfSU5URUdFUiwKKwkJU05EX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRCwKKwkJU05EX0NUTF9FTEVNX1RZUEVfQllURVMsCisJCVNORF9DVExfRUxFTV9UWVBFX0lFQzk1OCwKKwkJU05EX0NUTF9FTEVNX1RZUEVfSU5URUdFUjY0LAorCX07CisJY29uc3QgY2hhciAqdHlwZTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChzbmRfY29uZmlnX2dldF9zdHJpbmcobiwgJnR5cGUpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodHlwZXMpOyArK2kpCisJCWlmIChzdHJjbXAodHlwZSwgc25kX2N0bF9lbGVtX3R5cGVfbmFtZSh0eXBlc1tpXSkpID09IDApCisJCQlyZXR1cm4gdHlwZXNbaV07CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBnZXQgdGhlIHZhbHVlIHJhbmdlIGZyb20gdGhlIGdpdmVuIGNvbW1lbnQgY29uZmlnCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2NvbW1lbnRfcmFuZ2Uoc25kX2NvbmZpZ190ICpuLCBpbnQgY3R5cGUsCisJCQkgICAgIGxvbmcgKmltaW4sIGxvbmcgKmltYXgsIGxvbmcgKmlzdGVwKQoreworCWNvbnN0IGNoYXIgKnM7CisJaW50IGVycjsKKworCWlmIChzbmRfY29uZmlnX2dldF9zdHJpbmcobiwgJnMpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3dpdGNoIChjdHlwZSkgeworCWNhc2UgU05EX0NUTF9FTEVNX1RZUEVfSU5URUdFUjoKKwkJZXJyID0gc3NjYW5mKHMsICIlbGkgLSAlbGkgKHN0ZXAgJWxpKSIsIGltaW4sIGltYXgsIGlzdGVwKTsKKwkJaWYgKGVyciAhPSAzKSB7CisJCQlpc3RlcCA9IDA7CisJCQllcnIgPSBzc2NhbmYocywgIiVsaSAtICVsaSIsIGltaW4sIGltYXgpOworCQkJaWYgKGVyciAhPSAyKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHN0cmluZ19hcnJheSB7CisJdW5zaWduZWQgaW50IGNvdW50OworCWNvbnN0IGNoYXIgKipzdHJpbmdzOworfTsKKworc3RhdGljIGludCBnZXRfY29tbWVudF9pdGVtcyhzbmRfY29uZmlnX3QgKm4sIHN0cnVjdCBzdHJpbmdfYXJyYXkgKml0ZW1zKQoreworCXNuZF9jb25maWdfaXRlcmF0b3JfdCBpdCwgbmV4dDsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZXJyOworCisJc25kX2NvbmZpZ19mb3JfZWFjaChpdCwgbmV4dCwgbikgeworCQlzbmRfY29uZmlnX3QgKml0ZW0gPSBzbmRfY29uZmlnX2l0ZXJhdG9yX2VudHJ5KGl0KTsKKwkJY29uc3QgY2hhciAqaWQ7CisJCXVuc2lnbmVkIGludCBudW1pZDsKKworCQlpZiAoc25kX2NvbmZpZ19nZXRfaWQoaXRlbSwgJmlkKSA8IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbnVtaWQgPSBhdG9pKGlkKTsKKwkJaWYgKG51bWlkID4gOTk5OTk5KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKG51bWlkID49IGl0ZW1zLT5jb3VudCkgeworCQkJY29uc3QgY2hhciAqKnN0cmluZ3MgPSByZWFsbG9jKGl0ZW1zLT5zdHJpbmdzLCAobnVtaWQgKyAxKSAqIHNpemVvZihjaGFyICopKTsKKwkJCWlmICghc3RyaW5ncykKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCWZvciAoaSA9IGl0ZW1zLT5jb3VudDsgaSA8IG51bWlkICsgMTsgKytpKQorCQkJCXN0cmluZ3NbaV0gPSBOVUxMOworCQkJaXRlbXMtPmNvdW50ID0gbnVtaWQgKyAxOworCQkJaXRlbXMtPnN0cmluZ3MgPSBzdHJpbmdzOworCQl9CisJCWVyciA9IHNuZF9jb25maWdfZ2V0X3N0cmluZyhpdGVtLCAmaXRlbXMtPnN0cmluZ3NbbnVtaWRdKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBpdGVtcy0+Y291bnQ7ICsraSkKKwkJaWYgKCFpdGVtcy0+c3RyaW5nc1tpXSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3VzZXJfY29udHJvbChzbmRfY3RsX3QgKmhhbmRsZSwgc25kX2N0bF9lbGVtX2luZm9fdCAqaW5mbywgc25kX2NvbmZpZ190ICpjb25mKQoreworCXNuZF9jdGxfZWxlbV9pZF90ICppZDsKKwlzbmRfY29uZmlnX2l0ZXJhdG9yX3QgaSwgbmV4dDsKKwlsb25nIGltaW4sIGltYXgsIGlzdGVwOworCXNuZF9jdGxfZWxlbV90eXBlX3QgY3R5cGU7CisJdW5zaWduZWQgaW50IGNvdW50OworCXN0cnVjdCBzdHJpbmdfYXJyYXkgZW51bV9pdGVtczsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGludCAqdGx2OworCisJaW1pbiA9IGltYXggPSBpc3RlcCA9IDA7CisJY291bnQgPSAwOworCWN0eXBlID0gU05EX0NUTF9FTEVNX1RZUEVfTk9ORTsKKwllbnVtX2l0ZW1zLmNvdW50ID0gMDsKKwllbnVtX2l0ZW1zLnN0cmluZ3MgPSBOVUxMOworCXRsdiA9IE5VTEw7CisJc25kX2NvbmZpZ19mb3JfZWFjaChpLCBuZXh0LCBjb25mKSB7CisJCXNuZF9jb25maWdfdCAqbiA9IHNuZF9jb25maWdfaXRlcmF0b3JfZW50cnkoaSk7CisJCWNvbnN0IGNoYXIgKmlkOworCQlpZiAoc25kX2NvbmZpZ19nZXRfaWQobiwgJmlkKSA8IDApCisJCQljb250aW51ZTsKKwkJaWYgKHN0cmNtcChpZCwgInR5cGUiKSA9PSAwKSB7CisJCQllcnIgPSBnZXRfY29tbWVudF90eXBlKG4pOworCQkJaWYgKGVyciA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCWN0eXBlID0gZXJyOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHN0cmNtcChpZCwgInJhbmdlIikgPT0gMCkgeworCQkJZXJyID0gZ2V0X2NvbW1lbnRfcmFuZ2UobiwgY3R5cGUsICZpbWluLCAmaW1heCwgJmlzdGVwKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3RyY21wKGlkLCAiY291bnQiKSA9PSAwKSB7CisJCQlsb25nIHY7CisJCQlpZiAoKGVyciA9IHNuZF9jb25maWdfZ2V0X2ludGVnZXIobiwgJnYpKSA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCWNvdW50ID0gdjsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzdHJjbXAoaWQsICJpdGVtIikgPT0gMCkgeworCQkJZXJyID0gZ2V0X2NvbW1lbnRfaXRlbXMobiwgJmVudW1faXRlbXMpOworCQkJaWYgKGVyciA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzdHJjbXAoaWQsICJ0bHYiKSA9PSAwKSB7CisJCQljb25zdCBjaGFyICpzOworCQkJaWYgKChlcnIgPSBzbmRfY29uZmlnX2dldF9zdHJpbmcobiwgJnMpKSA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCWlmICh0bHYpCisJCQkJZnJlZSh0bHYpOworCQkJaWYgKCh0bHYgPSBzdHJfdG9fdGx2KHMpKSA9PSBOVUxMKSB7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwl9CisKKwlzbmRfY3RsX2VsZW1faWRfYWxsb2NhKCZpZCk7CisJc25kX2N0bF9lbGVtX2luZm9fZ2V0X2lkKGluZm8sIGlkKTsKKwlpZiAoY291bnQgPD0gMCkKKwkJY291bnQgPSAxOworCXN3aXRjaCAoY3R5cGUpIHsKKwljYXNlIFNORF9DVExfRUxFTV9UWVBFX0lOVEVHRVI6CisJCWlmIChpbWluID4gaW1heCB8fCBpc3RlcCA+IGltYXggLSBpbWluKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBlcnJvcjsKKwkJfQorCQllcnIgPSBzbmRfY3RsX2VsZW1fYWRkX2ludGVnZXIoaGFuZGxlLCBpZCwgY291bnQsIGltaW4sIGltYXgsIGlzdGVwKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGVycm9yOworCQlpZiAodGx2KQorCQkJc25kX2N0bF9lbGVtX3Rsdl93cml0ZShoYW5kbGUsIGlkLCB0bHYpOworCQlicmVhazsKKwljYXNlIFNORF9DVExfRUxFTV9UWVBFX0JPT0xFQU46CisJCWVyciA9IHNuZF9jdGxfZWxlbV9hZGRfYm9vbGVhbihoYW5kbGUsIGlkLCBjb3VudCk7CisJCWJyZWFrOworCWNhc2UgU05EX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDoKKwkJZXJyID0gc25kX2N0bF9lbGVtX2FkZF9lbnVtZXJhdGVkKGhhbmRsZSwgaWQsIGNvdW50LAorCQkJCQkJICBlbnVtX2l0ZW1zLmNvdW50LCBlbnVtX2l0ZW1zLnN0cmluZ3MpOworCQlicmVhazsKKwljYXNlIFNORF9DVExfRUxFTV9UWVBFX0lFQzk1ODoKKwkJZXJyID0gc25kX2N0bF9lbGVtX2FkZF9pZWM5NTgoaGFuZGxlLCBpZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworIGVycm9yOgorCWZyZWUodGx2KTsKKwlmcmVlKGVudW1faXRlbXMuc3RyaW5ncyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJcmV0dXJuIHNuZF9jdGxfZWxlbV9pbmZvKGhhbmRsZSwgaW5mbyk7Cit9CisKKy8qCisgKiBjaGVjayB3aGV0aGVyIHRoZSBjb25maWcgaXRlbSBoYXMgdGhlIHNhbWUgb2YgY29tcGF0aWJsZSB0eXBlCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfY29tbWVudF90eXBlKHNuZF9jb25maWdfdCAqY29uZiwgaW50IHR5cGUpCit7CisJc25kX2NvbmZpZ190ICpuOworCWludCBjdHlwZTsKKworCWlmIChzbmRfY29uZmlnX3NlYXJjaChjb25mLCAidHlwZSIsICZuKSA8IDApCisJCXJldHVybiAwOyAvKiBub3QgZGVmaW5lZCAqLworCWN0eXBlID0gZ2V0X2NvbW1lbnRfdHlwZShuKTsKKwlpZiAoY3R5cGUgPT0gdHlwZSkKKwkJcmV0dXJuIDA7CisJaWYgKChjdHlwZSA9PSBTTkRfQ1RMX0VMRU1fVFlQRV9CT09MRUFOIHx8CisJICAgICBjdHlwZSA9PSBTTkRfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSIHx8CisJICAgICBjdHlwZSA9PSBTTkRfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSNjQgfHwKKwkgICAgIGN0eXBlID09IFNORF9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQpICYmCisJICAgICh0eXBlID09IFNORF9DVExfRUxFTV9UWVBFX0JPT0xFQU4gfHwKKwkgICAgIHR5cGUgPT0gU05EX0NUTF9FTEVNX1RZUEVfSU5URUdFUiB8fAorCSAgICAgdHlwZSA9PSBTTkRfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSNjQgfHwKKwkgICAgIHR5cGUgPT0gU05EX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRCkpCisJCXJldHVybiAwOyAvKiBPSywgY29tcGF0aWJsZSAqLworCXJldHVybiAtRUlOVkFMOworfQorCisvKgorICogY29udmVydCBmcm9tIGFuIG9sZCB2YWx1ZSB0byBhIG5ldyB2YWx1ZSB3aXRoIHRoZSBzYW1lIGRCIGxldmVsCisgKi8KK3N0YXRpYyBpbnQgY29udmVydF90b19uZXdfZGIoc25kX2NvbmZpZ190ICp2YWx1ZSwgbG9uZyBvbWluLCBsb25nIG9tYXgsCisJCQkgICAgIGxvbmcgbm1pbiwgbG9uZyBubWF4LAorCQkJICAgICBsb25nIG9kYm1pbiwgbG9uZyBvZGJtYXgsCisJCQkgICAgIHNuZF9jb25maWdfdCAqY29tbWVudCwgY29uc3QgY2hhciAqaW5kZXgsCisJCQkgICAgIHNuZF9jdGxfdCAqZGV2aWNlLCBzbmRfY3RsX2VsZW1faWRfdCAqaWQsCisJCQkgICAgIGludCBkb2l0KQoreworCXNuZF9jb25maWdfdCAqZGJfbm9kZTsKKwlsb25nIGRiLCB2YWw7CisJaW50IGVycjsKKworCWlmIChzbmRfY29uZmlnX3NlYXJjaHYoY29tbWVudCwgJmRiX25vZGUsICJkYnZhbHVlIiwgaW5kZXgsIE5VTEwpIDwgMCB8fAorCSAgICBzbmRfY29uZmlnX2dldF9pbnRlZ2VyKGRiX25vZGUsICZkYikgPCAwKSB7CisJCWVyciA9IGNvbmZpZ19pbnRlZ2VyKHZhbHVlLCAmdmFsLCBkb2l0KTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlpZiAodmFsIDwgb21pbiB8fCB2YWwgPiBvbWF4KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWRiID0gKCh2YWwgLSBvbWluKSAqIChvZGJtYXggLSBvZGJtaW4pKSAvIChvbWF4IC0gb21pbikgKyBvZGJtaW47CisJfQorCisJZXJyID0gc25kX2N0bF9jb252ZXJ0X2Zyb21fZEIoZGV2aWNlLCBpZCwgZGIsICZ2YWwsIGRiID4gMCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJaWYgKHZhbCA8IG5taW4pCisJCXZhbCA9IG5taW47CisJZWxzZSBpZiAodmFsID4gbm1heCkKKwkJdmFsID0gbm1heDsKKwlyZXR1cm4gc25kX2NvbmZpZ19zZXRfaW50ZWdlcih2YWx1ZSwgdmFsKTsKK30KKworLyoKKyAqIGNvbXBhcmUgdGhlIGN1cnJlbnQgdmFsdWUgcmFuZ2Ugd2l0aCB0aGUgb2xkIHJhbmdlIGluIGNvbW1lbnRzLgorICogYWxzbywgaWYgZEIgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLCB0cnkgdG8gY29tcGFyZSB0aGVtLgorICogaWYgYW55IGNoYW5nZSBvY2N1cnMsIHRyeSB0byBrZWVwIHRoZSBzYW1lIGRCIGxldmVsLgorICovCitzdGF0aWMgaW50IGNoZWNrX2NvbW1lbnRfcmFuZ2Uoc25kX2N0bF90ICpoYW5kbGUsIHNuZF9jb25maWdfdCAqY29uZiwKKwkJCSAgICAgICBzbmRfY3RsX2VsZW1faW5mb190ICppbmZvLCBzbmRfY29uZmlnX3QgKnZhbHVlLAorCQkJICAgICAgIGludCBkb2l0KQoreworCXNuZF9jb25maWdfdCAqbjsKKwlsb25nIG9taW4sIG9tYXgsIG9zdGVwOworCWxvbmcgbm1pbiwgbm1heDsKKwlsb25nIG9kYm1pbiwgb2RibWF4OworCWxvbmcgbmRibWluLCBuZGJtYXg7CisJc25kX2N0bF9lbGVtX2lkX3QgKmlkOworCisJaWYgKHNuZF9jb25maWdfc2VhcmNoKGNvbmYsICJyYW5nZSIsICZuKSA8IDApCisJCXJldHVybiAwOworCWlmIChnZXRfY29tbWVudF9yYW5nZShuLCBTTkRfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSLAorCQkJICAgICAgJm9taW4sICZvbWF4LCAmb3N0ZXApIDwgMCkKKwkJcmV0dXJuIDA7CisJbm1pbiA9IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9taW4oaW5mbyk7CisJbm1heCA9IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9tYXgoaW5mbyk7CisJaWYgKG9taW4gIT0gbm1pbiAmJiBvbWF4ICE9IG5tYXgpIHsKKwkJLyogSGV5LCB0aGUgcmFuZ2UgbWlzbWF0Y2hlcyAqLworCQlpZiAoIWZvcmNlX3Jlc3RvcmUgfHwgIWRvaXQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKG9taW4gPj0gb21heCB8fCBubWluID49IG5tYXgpCisJCXJldHVybiAwOyAvKiBpbnZhbGlkIHZhbHVlcyAqLworCisJaWYgKHNuZF9jb25maWdfc2VhcmNoKGNvbmYsICJkYm1pbiIsICZuKSA8IDApCisJCXJldHVybiAwOworCWlmIChjb25maWdfaW50ZWdlcihuLCAmb2RibWluLCBkb2l0KSA8IDApCisJCXJldHVybiAwOworCWlmIChzbmRfY29uZmlnX3NlYXJjaChjb25mLCAiZGJtYXgiLCAmbikgPCAwKQorCQlyZXR1cm4gMDsKKwlpZiAoY29uZmlnX2ludGVnZXIobiwgJm9kYm1heCwgZG9pdCkgPCAwKQorCQlyZXR1cm4gMDsKKwlpZiAob2RibWluID49IG9kYm1heCkKKwkJcmV0dXJuIDA7IC8qIGludmFsaWQgdmFsdWVzICovCisJc25kX2N0bF9lbGVtX2lkX2FsbG9jYSgmaWQpOworCXNuZF9jdGxfZWxlbV9pbmZvX2dldF9pZChpbmZvLCBpZCk7CisJaWYgKHNuZF9jdGxfZ2V0X2RCX3JhbmdlKGhhbmRsZSwgaWQsICZuZGJtaW4sICZuZGJtYXgpIDwgMCkKKwkJcmV0dXJuIDA7CisJaWYgKG5kYm1pbiA+PSBuZGJtYXgpCisJCXJldHVybiAwOyAvKiBpbnZhbGlkIHZhbHVlcyAqLworCWlmIChvbWluID09IG5taW4gJiYgb21heCA9PSBubWF4ICYmCisJICAgIG9kYm1pbiA9PSBuZGJtaW4gJiYgb2RibWF4ID09IG5kYm1heCkKKwkJcmV0dXJuIDA7IC8qIE9LLCBpZGVudGljYWwgb25lICovCisKKwkvKiBMZXQncyBndWVzcyB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIGRCIHJhbmdlICovCisJaWYgKHNuZF9jb25maWdfZ2V0X3R5cGUodmFsdWUpID09IFNORF9DT05GSUdfVFlQRV9DT01QT1VORCkgeworCQlzbmRfY29uZmlnX2l0ZXJhdG9yX3QgaSwgbmV4dDsKKwkJc25kX2NvbmZpZ19mb3JfZWFjaChpLCBuZXh0LCB2YWx1ZSkgeworCQkJc25kX2NvbmZpZ190ICpuID0gc25kX2NvbmZpZ19pdGVyYXRvcl9lbnRyeShpKTsKKwkJCWNvbnN0IGNoYXIgKmlkeHN0cjsKKwkJCWlmIChzbmRfY29uZmlnX2dldF9pZChuLCAmaWR4c3RyKSA8IDApCisJCQkJY29udGludWU7CisJCQljb252ZXJ0X3RvX25ld19kYihuLCBvbWluLCBvbWF4LCBubWluLCBubWF4LAorCQkJCQkgIG9kYm1pbiwgb2RibWF4LCBjb25mLCBpZHhzdHIsCisJCQkJCSAgaGFuZGxlLCBpZCwgZG9pdCk7CisJCX0KKwl9IGVsc2UKKwkJY29udmVydF90b19uZXdfZGIodmFsdWUsIG9taW4sIG9tYXgsIG5taW4sIG5tYXgsCisJCQkJICBvZGJtaW4sIG9kYm1heCwgY29uZiwgIjAiLAorCQkJCSAgaGFuZGxlLCBpZCwgZG9pdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVzdG9yZV9jb25maWdfdmFsdWUoc25kX2N0bF90ICpoYW5kbGUsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKmluZm8sCisJCQkJc25kX2N0bF9lbGVtX2lmYWNlX3QgdHlwZSwKKwkJCQlzbmRfY29uZmlnX3QgKnZhbHVlLAorCQkJCXNuZF9jdGxfZWxlbV92YWx1ZV90ICpjdGwsIGludCBpZHgsCisJCQkJaW50IGRvaXQpCit7CisJbG9uZyB2YWw7CisJbG9uZyBsb25nIGx2YWw7CisJaW50IGVycjsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU05EX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjoKKwkJdmFsID0gY29uZmlnX2Jvb2wodmFsdWUsIGRvaXQpOworCQlpZiAodmFsID49IDApIHsKKwkJCXNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfYm9vbGVhbihjdGwsIGlkeCwgdmFsKTsKKwkJCXJldHVybiAxOworCQl9CisJCWJyZWFrOworCWNhc2UgU05EX0NUTF9FTEVNX1RZUEVfSU5URUdFUjoKKwkJZXJyID0gY29uZmlnX2ludGVnZXIodmFsdWUsICZ2YWwsIGRvaXQpOworCQlpZiAoZXJyID09IDApIHsKKwkJCXNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfaW50ZWdlcihjdGwsIGlkeCwgdmFsKTsKKwkJCXJldHVybiAxOworCQl9CisJCWJyZWFrOworCWNhc2UgU05EX0NUTF9FTEVNX1RZUEVfSU5URUdFUjY0OgorCQllcnIgPSBjb25maWdfaW50ZWdlcjY0KHZhbHVlLCAmbHZhbCwgZG9pdCk7CisJCWlmIChlcnIgPT0gMCkgeworCQkJc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9pbnRlZ2VyNjQoY3RsLCBpZHgsIGx2YWwpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOgorCQl2YWwgPSBjb25maWdfZW51bWVyYXRlZCh2YWx1ZSwgaGFuZGxlLCBpbmZvLCBkb2l0KTsKKwkJaWYgKHZhbCA+PSAwKSB7CisJCQlzbmRfY3RsX2VsZW1fdmFsdWVfc2V0X2VudW1lcmF0ZWQoY3RsLCBpZHgsIHZhbCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNORF9DVExfRUxFTV9UWVBFX0JZVEVTOgorCWNhc2UgU05EX0NUTF9FTEVNX1RZUEVfSUVDOTU4OgorCQlicmVhazsKKwlkZWZhdWx0OgorCQljZXJyb3IoZG9pdCwgIlVua25vdyBjb250cm9sIHR5cGU6ICVkIiwgdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZXN0b3JlX2NvbmZpZ192YWx1ZTIoc25kX2N0bF90ICpoYW5kbGUsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKmluZm8sCisJCQkJIHNuZF9jdGxfZWxlbV9pZmFjZV90IHR5cGUsCisJCQkJIHNuZF9jb25maWdfdCAqdmFsdWUsCisJCQkJIHNuZF9jdGxfZWxlbV92YWx1ZV90ICpjdGwsIGludCBpZHgsCisJCQkJIHVuc2lnbmVkIGludCBudW1pZCwgaW50IGRvaXQpCit7CisJaW50IGVyciA9IHJlc3RvcmVfY29uZmlnX3ZhbHVlKGhhbmRsZSwgaW5mbywgdHlwZSwgdmFsdWUsIGN0bCwgaWR4LCBkb2l0KTsKKwlsb25nIHZhbDsKKworCWlmIChlcnIgIT0gMCkKKwkJcmV0dXJuIGVycjsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNORF9DVExfRUxFTV9UWVBFX0JZVEVTOgorCWNhc2UgU05EX0NUTF9FTEVNX1RZUEVfSUVDOTU4OgorCQllcnIgPSBzbmRfY29uZmlnX2dldF9pbnRlZ2VyKHZhbHVlLCAmdmFsKTsKKwkJaWYgKGVyciA8IDAgfHwgdmFsIDwgMCB8fCB2YWwgPiAyNTUpIHsKKwkJCWNlcnJvcihkb2l0LCAiYmFkIGNvbnRyb2wuJWQudmFsdWUuJWQgY29udGVudCIsIG51bWlkLCBpZHgpOworCQkJcmV0dXJuIGZvcmNlX3Jlc3RvcmUgJiYgZG9pdCA/IDAgOiAtRUlOVkFMOworCQl9CisJCXNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfYnl0ZShjdGwsIGlkeCwgdmFsKTsKKwkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldF9jb250cm9sKHNuZF9jdGxfdCAqaGFuZGxlLCBzbmRfY29uZmlnX3QgKmNvbnRyb2wsCisJCSAgICAgICBpbnQgKm1heG51bWlkLCBpbnQgZG9pdCkKK3sKKwlzbmRfY3RsX2VsZW1fdmFsdWVfdCAqY3RsOworCXNuZF9jdGxfZWxlbV9pbmZvX3QgKmluZm87CisJc25kX2NvbmZpZ19pdGVyYXRvcl90IGksIG5leHQ7CisJdW5zaWduZWQgaW50IG51bWlkMTsKKwlzbmRfY3RsX2VsZW1faWZhY2VfdCBpZmFjZSA9IC0xOworCWludCBpZmFjZTE7CisJY29uc3QgY2hhciAqbmFtZTE7CisJdW5zaWduZWQgaW50IG51bWlkOworCXNuZF9jdGxfZWxlbV90eXBlX3QgdHlwZTsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJbG9uZyBkZXZpY2UgPSAtMTsKKwlsb25nIGRldmljZTE7CisJbG9uZyBzdWJkZXZpY2UgPSAtMTsKKwlsb25nIHN1YmRldmljZTE7CisJY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisJbG9uZyBpbmRleDE7CisJbG9uZyBpbmRleCA9IC0xOworCXNuZF9jb25maWdfdCAqdmFsdWUgPSBOVUxMOworCXNuZF9jb25maWdfdCAqY29tbWVudCA9IE5VTEw7CisJdW5zaWduZWQgaW50IGlkeDsKKwlpbnQgZXJyOworCWNoYXIgKnNldDsKKwljb25zdCBjaGFyICppZDsKKwlzbmRfY3RsX2VsZW1fdmFsdWVfYWxsb2NhKCZjdGwpOworCXNuZF9jdGxfZWxlbV9pbmZvX2FsbG9jYSgmaW5mbyk7CisJaWYgKHNuZF9jb25maWdfZ2V0X3R5cGUoY29udHJvbCkgIT0gU05EX0NPTkZJR19UWVBFX0NPTVBPVU5EKSB7CisJCWNlcnJvcihkb2l0LCAiY29udHJvbCBpcyBub3QgYSBjb21wb3VuZCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZXJyID0gc25kX2NvbmZpZ19nZXRfaWQoY29udHJvbCwgJmlkKTsKKwlpZiAoZXJyIDwgMCkgeworCQljZXJyb3IoZG9pdCwgInVuYWJsZSB0byBnZXQgaWQiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW51bWlkID0gYXRvaShpZCk7CisJaWYgKChpbnQpbnVtaWQgPiAqbWF4bnVtaWQpCisJCSptYXhudW1pZCA9IG51bWlkOworCXNuZF9jb25maWdfZm9yX2VhY2goaSwgbmV4dCwgY29udHJvbCkgeworCQlzbmRfY29uZmlnX3QgKm4gPSBzbmRfY29uZmlnX2l0ZXJhdG9yX2VudHJ5KGkpOworCQljb25zdCBjaGFyICpmbGQ7CisJCWlmIChzbmRfY29uZmlnX2dldF9pZChuLCAmZmxkKSA8IDApCisJCQljb250aW51ZTsKKwkJaWYgKHN0cmNtcChmbGQsICJjb21tZW50IikgPT0gMCkgeworCQkJaWYgKHNuZF9jb25maWdfZ2V0X3R5cGUobikgIT0gU05EX0NPTkZJR19UWVBFX0NPTVBPVU5EKSB7CisJCQkJY2Vycm9yKGRvaXQsICJjb250cm9sLiVkLiVzIGlzIGludmFsaWQiLCBudW1pZCwgZmxkKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWNvbW1lbnQgPSBuOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHN0cmNtcChmbGQsICJpZmFjZSIpID09IDApIHsKKwkJCWlmYWNlID0gKHNuZF9jdGxfZWxlbV9pZmFjZV90KWNvbmZpZ19pZmFjZShuKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzdHJjbXAoZmxkLCAiZGV2aWNlIikgPT0gMCkgeworCQkJaWYgKHNuZF9jb25maWdfZ2V0X3R5cGUobikgIT0gU05EX0NPTkZJR19UWVBFX0lOVEVHRVIpIHsKKwkJCQljZXJyb3IoZG9pdCwgImNvbnRyb2wuJWQuJXMgaXMgaW52YWxpZCIsIG51bWlkLCBmbGQpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJc25kX2NvbmZpZ19nZXRfaW50ZWdlcihuLCAmZGV2aWNlKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzdHJjbXAoZmxkLCAic3ViZGV2aWNlIikgPT0gMCkgeworCQkJaWYgKHNuZF9jb25maWdfZ2V0X3R5cGUobikgIT0gU05EX0NPTkZJR19UWVBFX0lOVEVHRVIpIHsKKwkJCQljZXJyb3IoZG9pdCwgImNvbnRyb2wuJWQuJXMgaXMgaW52YWxpZCIsIG51bWlkLCBmbGQpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJc25kX2NvbmZpZ19nZXRfaW50ZWdlcihuLCAmc3ViZGV2aWNlKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzdHJjbXAoZmxkLCAibmFtZSIpID09IDApIHsKKwkJCWlmIChzbmRfY29uZmlnX2dldF90eXBlKG4pICE9IFNORF9DT05GSUdfVFlQRV9TVFJJTkcpIHsKKwkJCQljZXJyb3IoZG9pdCwgImNvbnRyb2wuJWQuJXMgaXMgaW52YWxpZCIsIG51bWlkLCBmbGQpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJc25kX2NvbmZpZ19nZXRfc3RyaW5nKG4sICZuYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzdHJjbXAoZmxkLCAiaW5kZXgiKSA9PSAwKSB7CisJCQlpZiAoc25kX2NvbmZpZ19nZXRfdHlwZShuKSAhPSBTTkRfQ09ORklHX1RZUEVfSU5URUdFUikgeworCQkJCWNlcnJvcihkb2l0LCAiY29udHJvbC4lZC4lcyBpcyBpbnZhbGlkIiwgbnVtaWQsIGZsZCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlzbmRfY29uZmlnX2dldF9pbnRlZ2VyKG4sICZpbmRleCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3RyY21wKGZsZCwgInZhbHVlIikgPT0gMCkgeworCQkJdmFsdWUgPSBuOworCQkJY29udGludWU7CisJCX0KKwkJY2Vycm9yKGRvaXQsICJ1bmtub3duIGNvbnRyb2wuJWQuJXMgZmllbGQiLCBudW1pZCwgZmxkKTsKKwl9CisJaWYgKCF2YWx1ZSkgeworCQljZXJyb3IoZG9pdCwgIm1pc3NpbmcgY29udHJvbC4lZC52YWx1ZSIsIG51bWlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChkZXZpY2UgPCAwKQorCQlkZXZpY2UgPSAwOworCWlmIChzdWJkZXZpY2UgPCAwKQorCQlzdWJkZXZpY2UgPSAwOworCWlmIChpbmRleCA8IDApCisJCWluZGV4ID0gMDsKKworCWVyciA9IC1FSU5WQUw7CisJaWYgKCFmb3JjZV9yZXN0b3JlKSB7CisJCXNuZF9jdGxfZWxlbV9pbmZvX3NldF9udW1pZChpbmZvLCBudW1pZCk7CisJCWVyciA9IHNuZF9jdGxfZWxlbV9pbmZvKGhhbmRsZSwgaW5mbyk7CisJfQorCWlmIChlcnIgPCAwICYmIG5hbWUpIHsKKwkJc25kX2N0bF9lbGVtX2luZm9fc2V0X251bWlkKGluZm8sIDApOworCQlzbmRfY3RsX2VsZW1faW5mb19zZXRfaW50ZXJmYWNlKGluZm8sIGlmYWNlKTsKKwkJc25kX2N0bF9lbGVtX2luZm9fc2V0X2RldmljZShpbmZvLCBkZXZpY2UpOworCQlzbmRfY3RsX2VsZW1faW5mb19zZXRfc3ViZGV2aWNlKGluZm8sIHN1YmRldmljZSk7CisJCXNuZF9jdGxfZWxlbV9pbmZvX3NldF9uYW1lKGluZm8sIG5hbWUpOworCQlzbmRfY3RsX2VsZW1faW5mb19zZXRfaW5kZXgoaW5mbywgaW5kZXgpOworCQllcnIgPSBzbmRfY3RsX2VsZW1faW5mbyhoYW5kbGUsIGluZm8pOworCQlpZiAoZXJyIDwgMCAmJiBjb21tZW50ICYmIGNoZWNrX2NvbW1lbnRfYWNjZXNzKGNvbW1lbnQsICJ1c2VyIikpIHsKKwkJCWVyciA9IGFkZF91c2VyX2NvbnRyb2woaGFuZGxlLCBpbmZvLCBjb21tZW50KTsKKwkJCWlmIChlcnIgPCAwKSB7CisJCQkJY2Vycm9yKGRvaXQsICJmYWlsZWQgdG8gYWRkIHVzZXIgY29udHJvbCAjJWQgKCVzKSIsCisJCQkJICAgICAgIG51bWlkLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJfQorCX0KKwlpZiAoZXJyIDwgMCkgeworCQljZXJyb3IoZG9pdCwgImZhaWxlZCB0byBvYnRhaW4gaW5mbyBmb3IgY29udHJvbCAjJWQgKCVzKSIsIG51bWlkLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKwludW1pZDEgPSBzbmRfY3RsX2VsZW1faW5mb19nZXRfbnVtaWQoaW5mbyk7CisJaWZhY2UxID0gc25kX2N0bF9lbGVtX2luZm9fZ2V0X2ludGVyZmFjZShpbmZvKTsKKwlkZXZpY2UxID0gc25kX2N0bF9lbGVtX2luZm9fZ2V0X2RldmljZShpbmZvKTsKKwlzdWJkZXZpY2UxID0gc25kX2N0bF9lbGVtX2luZm9fZ2V0X3N1YmRldmljZShpbmZvKTsKKwluYW1lMSA9IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9uYW1lKGluZm8pOworCWluZGV4MSA9IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9pbmRleChpbmZvKTsKKwljb3VudCA9IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9jb3VudChpbmZvKTsKKwl0eXBlID0gc25kX2N0bF9lbGVtX2luZm9fZ2V0X3R5cGUoaW5mbyk7CisJaWYgKGVyciB8PSBudW1pZCAhPSBudW1pZDEgJiYgIWZvcmNlX3Jlc3RvcmUpCisJCWNlcnJvcihkb2l0LCAid2FybmluZzogbnVtaWQgbWlzbWF0Y2ggKCVkLyVkKSBmb3IgY29udHJvbCAjJWQiLCAKKwkJICAgICAgbnVtaWQsIG51bWlkMSwgbnVtaWQpOworCWlmIChlcnIgfD0gaWZhY2UgIT0gaWZhY2UxKQorCQljZXJyb3IoZG9pdCwgIndhcm5pbmc6IGlmYWNlIG1pc21hdGNoICglZC8lZCkgZm9yIGNvbnRyb2wgIyVkIiwgaWZhY2UsIGlmYWNlMSwgbnVtaWQpOworCWlmIChlcnIgfD0gZGV2aWNlICE9IGRldmljZTEpCisJCWNlcnJvcihkb2l0LCAid2FybmluZzogZGV2aWNlIG1pc21hdGNoICglbGQvJWxkKSBmb3IgY29udHJvbCAjJWQiLCBkZXZpY2UsIGRldmljZTEsIG51bWlkKTsKKwlpZiAoZXJyIHw9IHN1YmRldmljZSAhPSBzdWJkZXZpY2UxKQorCQljZXJyb3IoZG9pdCwgIndhcm5pbmc6IHN1YmRldmljZSBtaXNtYXRjaCAoJWxkLyVsZCkgZm9yIGNvbnRyb2wgIyVkIiwgc3ViZGV2aWNlLCBzdWJkZXZpY2UxLCBudW1pZCk7CisJaWYgKGVyciB8PSBzdHJjbXAobmFtZSwgbmFtZTEpKQorCQljZXJyb3IoZG9pdCwgIndhcm5pbmc6IG5hbWUgbWlzbWF0Y2ggKCVzLyVzKSBmb3IgY29udHJvbCAjJWQiLCBuYW1lLCBuYW1lMSwgbnVtaWQpOworCWlmIChlcnIgfD0gaW5kZXggIT0gaW5kZXgxKQorCQljZXJyb3IoZG9pdCwgIndhcm5pbmc6IGluZGV4IG1pc21hdGNoICglbGQvJWxkKSBmb3IgY29udHJvbCAjJWQiLCBpbmRleCwgaW5kZXgxLCBudW1pZCk7CisJaWYgKGVyciA8IDApIHsKKwkJY2Vycm9yKGRvaXQsICJmYWlsZWQgdG8gb2J0YWluIGluZm8gZm9yIGNvbnRyb2wgIyVkICglcykiLCBudW1pZCwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlpZiAoY29tbWVudCkgeworCQlpZiAoY2hlY2tfY29tbWVudF90eXBlKGNvbW1lbnQsIHR5cGUpIDwgMCkKKwkJCWNlcnJvcihkb2l0LCAiaW5jb21wYXRpYmxlIGZpZWxkIHR5cGUgZm9yIGNvbnRyb2wgIyVkIiwgbnVtaWQpOworCQlpZiAodHlwZSA9PSBTTkRfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSKSB7CisJCQlpZiAoY2hlY2tfY29tbWVudF9yYW5nZShoYW5kbGUsIGNvbW1lbnQsIGluZm8sIHZhbHVlLCBkb2l0KSA8IDApIHsKKwkJCQljZXJyb3IoZG9pdCwgInZhbHVlIHJhbmdlIG1pc21hdGNoIGZvciBjb250cm9sICMlZCIsCisJCQkJICAgICAgbnVtaWQpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJCS8qIGluYWN0aXZlIGNvbnRyb2xzIGFyZSBub3QgcmVzdG9yZWQgKi8KKwkJaWYgKGNvbW1lbnQgJiYgY2hlY2tfY29tbWVudF9hY2Nlc3MoY29tbWVudCwgImluYWN0aXZlIikpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc25kX2N0bF9lbGVtX2luZm9faXNfaW5hY3RpdmUoaW5mbykgfHwKKwkJCQkhc25kX2N0bF9lbGVtX2luZm9faXNfd3JpdGFibGUoaW5mbykpCisJCXJldHVybiAwOworCXNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfbnVtaWQoY3RsLCBudW1pZDEpOworCisJaWYgKGNvdW50ID09IDEpIHsKKwkJZXJyID0gcmVzdG9yZV9jb25maWdfdmFsdWUoaGFuZGxlLCBpbmZvLCB0eXBlLCB2YWx1ZSwgY3RsLCAwLCBkb2l0KTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlpZiAoZXJyID4gMCkKKwkJCWdvdG8gX29rOworCX0KKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNORF9DVExfRUxFTV9UWVBFX0JZVEVTOgorCWNhc2UgU05EX0NUTF9FTEVNX1RZUEVfSUVDOTU4OgorCXsKKwkJY29uc3QgY2hhciAqYnVmOworCQllcnIgPSBzbmRfY29uZmlnX2dldF9zdHJpbmcodmFsdWUsICZidWYpOworCQlpZiAoZXJyID49IDApIHsKKwkJCWludCBjMSA9IDA7CisJCQlpbnQgbGVuID0gc3RybGVuKGJ1Zik7CisJCQl1bnNpZ25lZCBpbnQgaWR4ID0gMDsKKwkJCWludCBzaXplID0gdHlwZSA9PSBTTkRfQ1RMX0VMRU1fVFlQRV9CWVRFUyA/CisJCQkJY291bnQgOiBzaXplb2Yoc25kX2Flc19pZWM5NThfdCk7CisJCQlpZiAoc2l6ZSAqIDIgIT0gbGVuKSB7CisJCQkJY2Vycm9yKGRvaXQsICJiYWQgY29udHJvbC4lZC52YWx1ZSBjb250ZW50c1xuIiwgbnVtaWQpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJd2hpbGUgKCpidWYpIHsKKwkJCQlpbnQgYyA9ICpidWYrKzsKKwkJCQlpZiAoKGMgPSBoZXh0b2RpZ2l0KGMpKSA8IDApIHsKKwkJCQkJY2Vycm9yKGRvaXQsICJiYWQgY29udHJvbC4lZC52YWx1ZSBjb250ZW50c1xuIiwgbnVtaWQpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQkJaWYgKGlkeCAlIDIgPT0gMSkKKwkJCQkJc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9ieXRlKGN0bCwgaWR4IC8gMiwgYzEgPDwgNCB8IGMpOworCQkJCWVsc2UKKwkJCQkJYzEgPSBjOworCQkJCWlkeCsrOworCQkJfQorCQkJZ290byBfb2s7CisJCX0KKwl9CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWlmIChzbmRfY29uZmlnX2dldF90eXBlKHZhbHVlKSAhPSBTTkRfQ09ORklHX1RZUEVfQ09NUE9VTkQpIHsKKwkJaWYgKCFmb3JjZV9yZXN0b3JlIHx8ICFkb2l0KSB7CisJCQljZXJyb3IoZG9pdCwgImJhZCBjb250cm9sLiVkLnZhbHVlIHR5cGUiLCBudW1pZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlmb3IgKGlkeCA9IDA7IGlkeCA8IGNvdW50OyArK2lkeCkgeworCQkJZXJyID0gcmVzdG9yZV9jb25maWdfdmFsdWUyKGhhbmRsZSwgaW5mbywgdHlwZSwgdmFsdWUsCisJCQkJCQkgICAgY3RsLCBpZHgsIG51bWlkLCBkb2l0KTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwkJZ290byBfb2s7CisJfQorCisJc2V0ID0gKGNoYXIqKSBhbGxvY2EoY291bnQpOworCW1lbXNldChzZXQsIDAsIGNvdW50KTsKKwlzbmRfY29uZmlnX2Zvcl9lYWNoKGksIG5leHQsIHZhbHVlKSB7CisJCXNuZF9jb25maWdfdCAqbiA9IHNuZF9jb25maWdfaXRlcmF0b3JfZW50cnkoaSk7CisJCWNvbnN0IGNoYXIgKmlkOworCQlpZiAoc25kX2NvbmZpZ19nZXRfaWQobiwgJmlkKSA8IDApCisJCQljb250aW51ZTsKKwkJaWR4ID0gYXRvaShpZCk7CisJCWlmIChpZHggPj0gY291bnQgfHwgc2V0W2lkeF0pIHsKKwkJCWNlcnJvcihkb2l0LCAiYmFkIGNvbnRyb2wuJWQudmFsdWUgaW5kZXgiLCBudW1pZCk7CisJCQlpZiAoIWZvcmNlX3Jlc3RvcmUgfHwgIWRvaXQpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQljb250aW51ZTsKKwkJfQorCQllcnIgPSByZXN0b3JlX2NvbmZpZ192YWx1ZTIoaGFuZGxlLCBpbmZvLCB0eXBlLCBuLAorCQkJCQkgICAgY3RsLCBpZHgsIG51bWlkLCBkb2l0KTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlpZiAoZXJyID4gMCkKKwkJCXNldFtpZHhdID0gMTsKKwl9CisJZm9yIChpZHggPSAwOyBpZHggPCBjb3VudDsgKytpZHgpIHsKKwkJaWYgKCFzZXRbaWR4XSkgeworCQkJY2Vycm9yKGRvaXQsICJjb250cm9sLiVkLnZhbHVlLiVkIGlzIG5vdCBzcGVjaWZpZWQiLCBudW1pZCwgaWR4KTsKKwkJCWlmICghZm9yY2VfcmVzdG9yZSB8fCAhZG9pdCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworIF9vazoKKwllcnIgPSBkb2l0ID8gc25kX2N0bF9lbGVtX3dyaXRlKGhhbmRsZSwgY3RsKSA6IDA7CisJaWYgKGVyciA8IDApIHsKKwkJZXJyb3IoIkNhbm5vdCB3cml0ZSBjb250cm9sICclZDolbGQ6JWxkOiVzOiVsZCcgOiAlcyIsIChpbnQpaWZhY2UsIGRldmljZSwgc3ViZGV2aWNlLCBuYW1lLCBpbmRleCwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfY29udHJvbHMoaW50IGNhcmQsIHNuZF9jb25maWdfdCAqdG9wLCBpbnQgZG9pdCkKK3sKKwlzbmRfY3RsX3QgKmhhbmRsZTsKKwlzbmRfY3RsX2NhcmRfaW5mb190ICppbmZvOworCXNuZF9jb25maWdfdCAqY29udHJvbDsKKwlzbmRfY29uZmlnX2l0ZXJhdG9yX3QgaSwgbmV4dDsKKwlpbnQgZXJyLCBtYXhudW1pZCA9IC0xOworCWNoYXIgbmFtZVszMl0sIHRtcGlkWzE2XTsKKwljb25zdCBjaGFyICppZDsKKwlzbmRfY3RsX2NhcmRfaW5mb19hbGxvY2EoJmluZm8pOworCisJc3ByaW50ZihuYW1lLCAiaHc6JWQiLCBjYXJkKTsKKwlkYmcoImRldmljZT0nJXMnLCBkb2l0PSVpIiwgbmFtZSwgZG9pdCk7CisJZXJyID0gc25kX2N0bF9vcGVuKCZoYW5kbGUsIG5hbWUsIDApOworCWlmIChlcnIgPCAwKSB7CisJCWVycm9yKCJzbmRfY3RsX29wZW4gZXJyb3I6ICVzIiwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gZXJyOworCX0KKwllcnIgPSBzbmRfY3RsX2NhcmRfaW5mbyhoYW5kbGUsIGluZm8pOworCWlmIChlcnIgPCAwKSB7CisJCWVycm9yKCJzbmRfY3RsX2NhcmRfaW5mbyBlcnJvcjogJXMiLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCWdvdG8gX2Nsb3NlOworCX0KKwlpZCA9IHNuZF9jdGxfY2FyZF9pbmZvX2dldF9pZChpbmZvKTsKKwlkYmcoImNhcmQtaW5mby1pZDogJyVzJyIsIGlkKTsKKwllcnIgPSBzbmRfY29uZmlnX3NlYXJjaHYodG9wLCAmY29udHJvbCwgInN0YXRlIiwgaWQsICJjb250cm9sIiwgMCk7CisJaWYgKGVyciA8IDApIHsKKwkJaWYgKGZvcmNlX3Jlc3RvcmUpIHsKKwkJCXNwcmludGYodG1waWQsICJjYXJkJWQiLCBjYXJkKTsKKwkJCWVyciA9IHNuZF9jb25maWdfc2VhcmNodih0b3AsICZjb250cm9sLCAic3RhdGUiLCB0bXBpZCwgImNvbnRyb2wiLCAwKTsKKwkJCWlmICghIGVycikKKwkJCQlpZCA9IHRtcGlkOworCQl9CisJCWlmIChlcnIgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIk5vIHN0YXRlIGlzIHByZXNlbnQgZm9yIGNhcmQgJXNcbiIsIGlkKTsKKwkJCWdvdG8gX2Nsb3NlOworCQl9CisJCWlkID0gdG1waWQ7CisJfQorCWlmIChzbmRfY29uZmlnX2dldF90eXBlKGNvbnRyb2wpICE9IFNORF9DT05GSUdfVFlQRV9DT01QT1VORCkgeworCQljZXJyb3IoZG9pdCwgInN0YXRlLiVzLmNvbnRyb2wgaXMgbm90IGEgY29tcG91bmRcbiIsIGlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXNuZF9jb25maWdfZm9yX2VhY2goaSwgbmV4dCwgY29udHJvbCkgeworCQlzbmRfY29uZmlnX3QgKm4gPSBzbmRfY29uZmlnX2l0ZXJhdG9yX2VudHJ5KGkpOworCQllcnIgPSBzZXRfY29udHJvbChoYW5kbGUsIG4sICZtYXhudW1pZCwgZG9pdCk7CisJCWlmIChlcnIgPCAwICYmICghZm9yY2VfcmVzdG9yZSB8fCAhZG9pdCkpCisJCQlnb3RvIF9jbG9zZTsKKwl9CisKKwlkYmcoIm1heG51bWlkPSVpIiwgbWF4bnVtaWQpOworCS8qIGNoZWNrIGlmIHdlIGhhdmUgYWRkaXRpb25hbCBjb250cm9scyBpbiBkcml2ZXIgKi8KKwkvKiBpbiB0aGlzIGNhc2Ugd2Ugc2hvdWxkIGdvIHRocm91Z2ggaW5pdCBwcm9jZWR1cmUgKi8KKwlpZiAoIWRvaXQgJiYgbWF4bnVtaWQgPj0gMCkgeworCQlzbmRfY3RsX2VsZW1faW5mb190ICppbmZvOworCQlzbmRfY3RsX2VsZW1faW5mb19hbGxvY2EoJmluZm8pOworCQlzbmRfY3RsX2VsZW1faW5mb19zZXRfbnVtaWQoaW5mbywgbWF4bnVtaWQrMSk7CisJCWlmIChzbmRfY3RsX2VsZW1faW5mbyhoYW5kbGUsIGluZm8pID09IDApIHsKKwkJCS8qIG5vdCB2ZXJ5IGluZm9ybWF0aXZlICovCisJCQkvKiBidXQgdmFsdWUgaXMgdXNlZCBmb3IgY2hlY2sgb25seSAqLworCQkJZXJyID0gLUVBR0FJTjsKKwkJCWRiZygibW9yZSBjb250cm9scyB0aGFuIG1heG51bWlkPyIpOworCQkJZ290byBfY2xvc2U7CisJCX0KKwl9CisKKyBfY2xvc2U6CisJc25kX2N0bF9jbG9zZShoYW5kbGUpOworCWRiZygicmVzdWx0IGNvZGU6ICVpIiwgZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgc2F2ZV9zdGF0ZShjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICpjYXJkbmFtZSkKK3sKKwlpbnQgZXJyOworCXNuZF9jb25maWdfdCAqY29uZmlnOworCXNuZF9pbnB1dF90ICppbjsKKwlzbmRfb3V0cHV0X3QgKm91dDsKKwlpbnQgc3RkaW87CisKKwllcnIgPSBzbmRfY29uZmlnX3RvcCgmY29uZmlnKTsKKwlpZiAoZXJyIDwgMCkgeworCQllcnJvcigic25kX2NvbmZpZ190b3AgZXJyb3I6ICVzIiwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gZXJyOworCX0KKwlzdGRpbyA9ICFzdHJjbXAoZmlsZSwgIi0iKTsKKwlpZiAoIXN0ZGlvICYmIChlcnIgPSBzbmRfaW5wdXRfc3RkaW9fb3BlbigmaW4sIGZpbGUsICJyIikpID49IDApIHsKKwkJZXJyID0gc25kX2NvbmZpZ19sb2FkKGNvbmZpZywgaW4pOworCQlzbmRfaW5wdXRfY2xvc2UoaW4pOworI2lmIDAKKwkJaWYgKGVyciA8IDApIHsKKwkJCWVycm9yKCJzbmRfY29uZmlnX2xvYWQgZXJyb3I6ICVzIiwgc25kX3N0cmVycm9yKGVycikpOworCQkJcmV0dXJuIGVycjsKKwkJfQorI2VuZGlmCisJfQorCisJaWYgKCFjYXJkbmFtZSkgeworCQlpbnQgY2FyZCwgZmlyc3QgPSAxOworCisJCWNhcmQgPSAtMTsKKwkJLyogZmluZCBlYWNoIGluc3RhbGxlZCBzb3VuZGNhcmRzICovCisJCXdoaWxlICgxKSB7CisJCQlpZiAoc25kX2NhcmRfbmV4dCgmY2FyZCkgPCAwKQorCQkJCWJyZWFrOworCQkJaWYgKGNhcmQgPCAwKSB7CisJCQkJaWYgKGZpcnN0KSB7CisJCQkJCWlmIChpZ25vcmVfbm9jYXJkcykgeworCQkJCQkJcmV0dXJuIDA7CisJCQkJCX0gZWxzZSB7CisJCQkJCQllcnJvcigiTm8gc291bmRjYXJkcyBmb3VuZC4uLiIpOworCQkJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQlmaXJzdCA9IDA7CisJCQlpZiAoKGVyciA9IGdldF9jb250cm9scyhjYXJkLCBjb25maWcpKSkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJfSBlbHNlIHsKKwkJaW50IGNhcmRubzsKKworCQljYXJkbm8gPSBzbmRfY2FyZF9nZXRfaW5kZXgoY2FyZG5hbWUpOworCQlpZiAoY2FyZG5vIDwgMCkgeworCQkJZXJyb3IoIkNhbm5vdCBmaW5kIHNvdW5kY2FyZCAnJXMnLi4uIiwgY2FyZG5hbWUpOworCQkJcmV0dXJuIGNhcmRubzsKKwkJfQorCQlpZiAoKGVyciA9IGdldF9jb250cm9scyhjYXJkbm8sIGNvbmZpZykpKSB7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCQorCWlmIChzdGRpbykKKwkJZXJyID0gc25kX291dHB1dF9zdGRpb19hdHRhY2goJm91dCwgc3Rkb3V0LCAwKTsKKwllbHNlCisJCWVyciA9IHNuZF9vdXRwdXRfc3RkaW9fb3Blbigmb3V0LCBmaWxlLCAidyIpOworCWlmIChlcnIgPCAwKSB7CisJCWVycm9yKCJDYW5ub3Qgb3BlbiAlcyBmb3Igd3JpdGluZzogJXMiLCBmaWxlLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybiAtZXJybm87CisJfQorCWVyciA9IHNuZF9jb25maWdfc2F2ZShjb25maWcsIG91dCk7CisJc25kX291dHB1dF9jbG9zZShvdXQpOworCWlmIChlcnIgPCAwKQorCQllcnJvcigic25kX2NvbmZpZ19zYXZlOiAlcyIsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGxvYWRfc3RhdGUoY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqaW5pdGZpbGUsIGNvbnN0IGNoYXIgKmNhcmRuYW1lLAorCSAgICAgICBpbnQgZG9faW5pdCkKK3sKKwlpbnQgZXJyLCBmaW5hbGVyciA9IDA7CisJc25kX2NvbmZpZ190ICpjb25maWc7CisJc25kX2lucHV0X3QgKmluOworCWludCBzdGRpbzsKKworCWVyciA9IHNuZF9jb25maWdfdG9wKCZjb25maWcpOworCWlmIChlcnIgPCAwKSB7CisJCWVycm9yKCJzbmRfY29uZmlnX3RvcCBlcnJvcjogJXMiLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybiBlcnI7CisJfQorCXN0ZGlvID0gIXN0cmNtcChmaWxlLCAiLSIpOworCWlmIChzdGRpbykKKwkJZXJyID0gc25kX2lucHV0X3N0ZGlvX2F0dGFjaCgmaW4sIHN0ZGluLCAwKTsKKwllbHNlCisJCWVyciA9IHNuZF9pbnB1dF9zdGRpb19vcGVuKCZpbiwgZmlsZSwgInIiKTsKKwlpZiAoZXJyID49IDApIHsKKwkJZXJyID0gc25kX2NvbmZpZ19sb2FkKGNvbmZpZywgaW4pOworCQlzbmRfaW5wdXRfY2xvc2UoaW4pOworCQlpZiAoZXJyIDwgMCkgeworCQkJZXJyb3IoInNuZF9jb25maWdfbG9hZCBlcnJvcjogJXMiLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfSBlbHNlIHsKKwkJaW50IGNhcmQsIGZpcnN0ID0gMTsKKwkJY2hhciBjYXJkbmFtZTFbMTZdOworCisJCWVycm9yKCJDYW5ub3Qgb3BlbiAlcyBmb3IgcmVhZGluZzogJXMiLCBmaWxlLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCWZpbmFsZXJyID0gZXJyOworCQljYXJkID0gLTE7CisJCS8qIGZpbmQgZWFjaCBpbnN0YWxsZWQgc291bmRjYXJkcyAqLworCQl3aGlsZSAoMSkgeworCQkJaWYgKHNuZF9jYXJkX25leHQoJmNhcmQpIDwgMCkKKwkJCQlicmVhazsKKwkJCWlmIChjYXJkIDwgMCkKKwkJCQlicmVhazsKKwkJCWZpcnN0ID0gMDsKKwkJCWlmICghZG9faW5pdCkKKwkJCQlicmVhazsKKwkJCXNwcmludGYoY2FyZG5hbWUxLCAiJWkiLCBjYXJkKTsKKwkJCWVyciA9IGluaXQoaW5pdGZpbGUsIGNhcmRuYW1lMSk7CisJCQlpZiAoZXJyIDwgMCkgeworCQkJCWZpbmFsZXJyID0gZXJyOworCQkJCWluaXRmYWlsZWQoY2FyZCwgImluaXQiLCBlcnIpOworCQkJfQorCQkJaW5pdGZhaWxlZChjYXJkLCAicmVzdG9yZSIsIC1FTk9FTlQpOworCQl9CisJCWlmIChmaXJzdCkKKwkJCWZpbmFsZXJyID0gMDsJLyogbm8gY2FyZHMsIG5vIGVycm9yIGNvZGUgKi8KKwkJcmV0dXJuIGZpbmFsZXJyOworCX0KKworCWlmICghY2FyZG5hbWUpIHsKKwkJaW50IGNhcmQsIGZpcnN0ID0gMTsKKwkJY2hhciBjYXJkbmFtZTFbMTZdOworCisJCWNhcmQgPSAtMTsKKwkJLyogZmluZCBlYWNoIGluc3RhbGxlZCBzb3VuZGNhcmRzICovCisJCXdoaWxlICgxKSB7CisJCQlpZiAoc25kX2NhcmRfbmV4dCgmY2FyZCkgPCAwKQorCQkJCWJyZWFrOworCQkJaWYgKGNhcmQgPCAwKSB7CisJCQkJaWYgKGZpcnN0KSB7CisJCQkJCWlmIChpZ25vcmVfbm9jYXJkcykgeworCQkJCQkJcmV0dXJuIDA7CisJCQkJCX0gZWxzZSB7CisJCQkJCQllcnJvcigiTm8gc291bmRjYXJkcyBmb3VuZC4uLiIpOworCQkJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQlmaXJzdCA9IDA7CisJCQkvKiBkbyBhIGNoZWNrIGlmIGNvbnRyb2xzIG1hdGNoZXMgc3RhdGUgZmlsZSAqLworIAkJCWlmIChkb19pbml0ICYmIHNldF9jb250cm9scyhjYXJkLCBjb25maWcsIDApKSB7CisJCQkJc3ByaW50ZihjYXJkbmFtZTEsICIlaSIsIGNhcmQpOworCQkJCWVyciA9IGluaXQoaW5pdGZpbGUsIGNhcmRuYW1lMSk7CisJCQkJaWYgKGVyciA8IDApIHsKKwkJCQkJaW5pdGZhaWxlZChjYXJkLCAiaW5pdCIsIGVycik7CisJCQkJCWZpbmFsZXJyID0gZXJyOworCQkJCX0KKwkJCX0KKwkJCWlmICgoZXJyID0gc2V0X2NvbnRyb2xzKGNhcmQsIGNvbmZpZywgMSkpKSB7CisJCQkJaWYgKCFmb3JjZV9yZXN0b3JlKQorCQkJCQlmaW5hbGVyciA9IGVycjsKKwkJCQlpbml0ZmFpbGVkKGNhcmQsICJyZXN0b3JlIiwgZXJyKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWludCBjYXJkbm87CisKKwkJY2FyZG5vID0gc25kX2NhcmRfZ2V0X2luZGV4KGNhcmRuYW1lKTsKKwkJaWYgKGNhcmRubyA8IDApIHsKKwkJCWVycm9yKCJDYW5ub3QgZmluZCBzb3VuZGNhcmQgJyVzJy4uLiIsIGNhcmRuYW1lKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCS8qIGRvIGEgY2hlY2sgaWYgY29udHJvbHMgbWF0Y2hlcyBzdGF0ZSBmaWxlICovCisJCWlmIChkb19pbml0ICYmIHNldF9jb250cm9scyhjYXJkbm8sIGNvbmZpZywgMCkpIHsKKwkJCWVyciA9IGluaXQoaW5pdGZpbGUsIGNhcmRuYW1lKTsKKwkJCWlmIChlcnIgPCAwKSB7CisJCQkJaW5pdGZhaWxlZChjYXJkbm8sICJpbml0IiwgZXJyKTsKKwkJCQlmaW5hbGVyciA9IGVycjsKKwkJCX0KKwkJfQorCQlpZiAoKGVyciA9IHNldF9jb250cm9scyhjYXJkbm8sIGNvbmZpZywgMSkpKSB7CisJCQlpbml0ZmFpbGVkKGNhcmRubywgInJlc3RvcmUiLCBlcnIpOworCQkJaWYgKCFmb3JjZV9yZXN0b3JlKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwl9CisJcmV0dXJuIGZpbmFsZXJyOworfQpkaWZmIC0tZ2l0IGEvYWxzYWN0bC91dGlscy5jIGIvYWxzYWN0bC91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyN2ViNmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbHNhY3RsL3V0aWxzLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiAgQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlIENvbnRyb2wgUHJvZ3JhbSAtIFN1cHBvcnQgcm91dGluZXMKKyAqICBDb3B5cmlnaHQgKGMpIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisjaW5jbHVkZSA8YWxzYS9hc291bmRsaWIuaD4KKyNpbmNsdWRlICJhbHNhY3RsLmgiCisKK2ludCBmaWxlX21hcChjb25zdCBjaGFyICpmaWxlbmFtZSwgY2hhciAqKmJ1Ziwgc2l6ZV90ICpidWZzaXplKQoreworCXN0cnVjdCBzdGF0IHN0YXRzOworCWludCBmZDsKKworCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDApIHsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChmc3RhdChmZCwgJnN0YXRzKSA8IDApIHsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gLTE7CisJfQorCisJKmJ1ZiA9IG1tYXAoTlVMTCwgc3RhdHMuc3Rfc2l6ZSwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBmZCwgMCk7CisJaWYgKCpidWYgPT0gTUFQX0ZBSUxFRCkgeworCQljbG9zZShmZCk7CisJCXJldHVybiAtMTsKKwl9CisJKmJ1ZnNpemUgPSBzdGF0cy5zdF9zaXplOworCisJY2xvc2UoZmQpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmlsZV91bm1hcCh2b2lkICpidWYsIHNpemVfdCBidWZzaXplKQoreworCW11bm1hcChidWYsIGJ1ZnNpemUpOworfQorCitzaXplX3QgbGluZV93aWR0aChjb25zdCBjaGFyICpidWYsIHNpemVfdCBidWZzaXplLCBzaXplX3QgcG9zKQoreworCWludCBlc2MgPSAwOworCXNpemVfdCBjb3VudDsKKwkKKwlmb3IgKGNvdW50ID0gcG9zOyBjb3VudCA8IGJ1ZnNpemU7IGNvdW50KyspIHsKKwkJaWYgKCFlc2MgJiYgYnVmW2NvdW50XSA9PSAnXG4nKQorCQkJYnJlYWs7CisJCWVzYyA9IGJ1Zltjb3VudF0gPT0gJ1xcJzsKKwl9CisKKwlyZXR1cm4gY291bnQgLSBwb3M7Cit9CisKK3ZvaWQgaW5pdGZhaWxlZChpbnQgY2FyZG51bWJlciwgY29uc3QgY2hhciAqcmVhc29uLCBpbnQgZXhpdGNvZGUpCit7CisJaW50IGZwOworCWNoYXIgKnN0cjsKKwljaGFyIHNleGl0Y29kZVsxNl07CisKKwlpZiAoc3RhdGVmaWxlID09IE5VTEwpCisJCXJldHVybjsKKwlpZiAoc25kX2NhcmRfZ2V0X25hbWUoY2FyZG51bWJlciwgJnN0cikgPCAwKQorCQlyZXR1cm47CisJc3ByaW50ZihzZXhpdGNvZGUsICIlaSIsIGV4aXRjb2RlKTsKKwlmcCA9IG9wZW4oc3RhdGVmaWxlLCBPX1dST05MWXxPX0NSRUFUfE9fQVBQRU5ELCAwNjQ0KTsKKwl3cml0ZShmcCwgc3RyLCBzdHJsZW4oc3RyKSk7CisJd3JpdGUoZnAsICI6IiwgMSk7CisJd3JpdGUoZnAsIHJlYXNvbiwgc3RybGVuKHJlYXNvbikpOworCXdyaXRlKGZwLCAiOiIsIDEpOworCXdyaXRlKGZwLCBzZXhpdGNvZGUsIHN0cmxlbihzZXhpdGNvZGUpKTsKKwl3cml0ZShmcCwgIlxuIiwgMSk7CisJY2xvc2UoZnApOworCWZyZWUoc3RyKTsKK30KZGlmZiAtLWdpdCBhL2Fsc2Fsb29wL01ha2VmaWxlLmFtIGIvYWxzYWxvb3AvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY5NDkxMQotLS0gL2Rldi9udWxsCisrKyBiL2Fsc2Fsb29wL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTQgQEAKK0lOQ0xVREVTID0gLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUKK0xEQUREID0gLWxtCitBTV9DRkxBR1MgPSAtRF9HTlVfU09VUkNFCitpZiBIQVZFX1NBTVBMRVJBVEUKK0xEQUREICs9IC1sc2FtcGxlcmF0ZQorZW5kaWYKKyMgTERGTEFHUyA9IC1zdGF0aWMKKyMgQ0ZMQUdTICs9IC1nIC1XYWxsCisKK2Jpbl9QUk9HUkFNUyA9IGFsc2Fsb29wCithbHNhbG9vcF9TT1VSQ0VTID0gYWxzYWxvb3AuYyBwY21qb2IuYyBjb250cm9sLmMKK25vaW5zdF9IRUFERVJTID0gYWxzYWxvb3AuaAorbWFuX01BTlMgPSBhbHNhbG9vcC4xCitFWFRSQV9ESVNUID0gYWxzYWxvb3AuMQpkaWZmIC0tZ2l0IGEvYWxzYWxvb3AvYWxzYWxvb3AuMSBiL2Fsc2Fsb29wL2Fsc2Fsb29wLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ4ZDFlMAotLS0gL2Rldi9udWxsCisrKyBiL2Fsc2Fsb29wL2Fsc2Fsb29wLjEKQEAgLTAsMCArMSwyMDYgQEAKKy5USCBBTFNBTE9PUCAxICI1IEF1ZyAyMDEwIgorLlNIIE5BTUUKK2Fsc2Fsb29wIFwtIGNvbW1hbmQtbGluZSBQQ00gbG9vcGJhY2sKKy5TSCBTWU5PUFNJUworXGZCYWxzYWxvb3BcZlAgW1xmSVwtb3B0aW9uXGZQXSBbXGZJY21kXGZQXQorLlNIIERFU0NSSVBUSU9OCisKK1xmQmFsc2Fsb29wXGZQIGFsbG93cyBjcmVhdGUgYSBQQ00gbG9vcGJhY2sgYmV0d2VlbiBhIFBDTSBjYXB0dXJlIGRldmljZQorYW5kIGEgUENNIHBsYXliYWNrIGRldmljZS4KKworXGZCYWxzYWxvb3BcZlAgc3VwcG9ydHMgbXVsdGlwbGUgc291bmRjYXJkcywgYWRhcHRpdmUgY2xvY2sgc3luY2hyb25pemF0aW9uLAorYWRhcHRpdmUgcmF0ZSByZXNhbXBsaW5nIHVzaW5nIHRoZSBzYW1wbGVyYXRlIGxpYnJhcnkgKGlmIGF2YWlsYWJsZSBpbgordGhlIHN5c3RlbSkuIEFsc28sIG1peGVyIGNvbnRyb2xzIGNhbiBiZSByZWRpcmVjdGVkIGZyb20gb25lIGNhcmQgdG8KK2Fub3RoZXIgKGZvciBleGFtcGxlIE1hc3RlciBhbmQgUENNKS4KKworLlNIIE9QVElPTlMKKworLlRQCitcZklcLWhcZlAgfCBcZklcLVwtaGVscFxmUAorCitQcmludHMgdGhlIGhlbHAgaW5mb3JtYXRpb24uCisKKy5UUAorXGZJXC1nIDxmaWxlPlxmUCB8IFxmSVwtXC1jb25maWc9PGZpbGU+XGZQCisKK1VzZSBnaXZlbiBjb25maWd1cmF0aW9uIGZpbGUuIFRoZSBzeW50YXggb2YgdGhpcyBmaWxlIGlzIHNpbXBsZTogb25lIGxpbmUKK2NvbnRhaW5zIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3Igb25lIGpvYi4gVGhlICcjJyBtZWFucyBjb21tZW50IGFuZAorcmVzdCBvZiBsaW5lIGlzIGlnbm9yZWQuIEV4YW1wbGU6CisKKyAgIyBGaXJzdCBsaW5lIC0gY29tbWVudCwgc2Vjb25kIGxpbmUgLSBmaXJzdCBqb2IKKyAgLUMgaHc6MSwwIC1QIGh3OjAsMCAtdCA1MDAwMCAtVCAxCisgICMgVGhpcmQgbGluZSAtIGNvbW1lbnQsIGZvdXJ0aCBsaW5lIC0gc2Vjb25kIGpvYgorICAtQyBodzoxLDEgLVAgaHc6MCwxIC10IDQwMDAwIC1UIDIKKworLlRQCitcZklcLWRcZlAgfCBcZklcLVwtZGFlbW9uaXplXGZQCisKK0RhZW1vbml6ZSB0aGUgbWFpbiBwcm9jZXNzIGFuZCB1c2Ugc3lzbG9nIGZvciBtZXNzYWdlcy4KKworLlRQCitcZklcLVAgPGRldmljZT5cZlAgfCBcZklcLVwtcGRldmljZT08ZGV2aWNlPlxmUAorCitVc2UgZ2l2ZW4gcGxheWJhY2sgZGV2aWNlLgorCisuVFAKK1xmSVwtQyA8ZGV2aWNlPlxmUCB8IFxmSVwtXC1jZGV2aWNlPTxkZXZpY2U+XGZQCisKK1VzZSBnaXZlbiBjYXB0dXJlIGRldmljZS4KKworLlRQCitcZklcLVggPGRldmljZT5cZlAgfCBcZklcLVwtcGN0bD08ZGV2aWNlPlxmUAorCitVc2UgZ2l2ZW4gQ1RMIGRldmljZSBmb3IgcGxheWJhY2suCisKKy5UUAorXGZJXC1ZIDxkZXZpY2U+XGZQIHwgXGZJXC1cLWNjdGw9PGRldmljZT5cZlAKKworVXNlIGdpdmVuIENUTCBkZXZpY2UgZm9yIGNhcHR1cmUuCisKKy5UUAorXGZJXC1sIDxsYXRlbmN5PlxmUCB8IFxmSVwtXC1sYXRlbmN5PTxmcmFtZXM+XGZQCisKK1JlcXVlc3RlZCBsYXRlbmN5IGluIGZyYW1lcy4KKworLlRQCitcZklcLXQgPHVzZWM+XGZQIHwgXGZJXC1cLXRsYXRlbmN5PTx1c2VjPlxmUAorCitSZXF1ZXN0ZWQgbGF0ZW5jeSBpbiB1c2VjICgxLzEwMDAwMDBzZWMpLgorCisuVFAKK1xmSVwtZiA8Zm9ybWF0PlxmUCB8IFxmSVwtXC1mb3JtYXQ9PGZvcm1hdD5cZlAKKworRm9ybWF0IHNwZWNpZmljYXRpb24gKHVzdWFsbHkgUzE2X0xFIFMzMl9MRSkuIFVzZSAtaCB0byBsaXN0IGFsbCBmb3JtYXRzLgorRGVmYXVsdCBmb3JtYXQgaXMgUzE2X0xFLgorCisuVFAKK1xmSVwtYyA8Y2hhbm5lbHM+XGZQIHwgXGZJXC1cLWNoYW5uZWxzPTxjaGFubmVscz5cZlAKKworQ2hhbm5lbCBjb3VudCBzcGVjaWZpY2F0aW9uLiBEZWZhdWx0IHZhbHVlIGlzIDIuCisKKy5UUAorXGZJXC1jIDxyYXRlPlxmUCB8IFxmSVwtXC1yYXRlPTxyYXRlPlxmUAorCitSYXRlIHNwZWNpZmljYXRpb24uIERlZmF1bHQgdmFsdWUgaXMgNDgwMDAgKEh6KS4KKworLlRQCitcZklcLW5cZlAgfCBcZklcLVwtcmVzYW1wbGVcZlAKKworQWxsb3cgcmF0ZSByZXNhbXBsaW5nIHVzaW5nIGFsc2EtbGliLgorCisuVFAKK1xmSVwtQSA8Y29udmVydGVyPlxmUCB8IFxmSVwtXC1zYW1wbGVyYXRlPTxjb252ZXJ0ZXI+XGZQCisKK1VzZSBsaWJzYW1wbGVyYXRlIGFuZCBjaG9vc2UgYSBjb252ZXJ0ZXI6CisKKyAgMCBvciBzaW5jYmVzdCAgICAgLSBiZXN0IHF1YWxpdHkKKyAgMSBvciBzaW5jbWVkaXVtICAgLSBtZWRpdW0gcXVhbGl0eQorICAyIG9yIHNpbmNmYXN0ZXN0ICAtIGxvd2VzdCBxdWFsaXR5CisgIDMgb3IgemVyb2hvbGQgICAgIC0gaG9sZCB6ZXJvIHNhbXBsZXMKKyAgNCBvciBsaW5lYXIgICAgICAgLSB3b3JzdCBxdWFsaXR5IC0gbGluZWFyIHJlc2FtcGxpbmcKKyAgNSBvciBhdXRvICAgICAgICAgLSBjaG9vc2UgYmVzdCBtZXRob2QKKworLlRQCitcZklcLUIgPHNpemU+XGZQIHwgXGZJXC1cLWJ1ZmZlcj08c2l6ZT5cZlAKKworQnVmZmVyIHNpemUgaW4gZnJhbWVzLgorCisuVFAKK1xmSVwtRSA8c2l6ZT5cZlAgfCBcZklcLVwtcGVyaW9kPTxzaXplPlxmUAorCitQZXJpb2Qgc2l6ZSBpbiBmcmFtZXMuCisKKy5UUAorXGZJXC1zIDxzZWNzPlxmUCB8IFxmSVwtXC1zZWNvbmRzPTxzZWNzPlxmUAorCitEdXJhdGlvbiBvZiBsb29wIGluIHNlY29uZHMuCisKKy5UUAorXGZJXC1iXGZQIHwgXGZJXC1cLW5ibG9ja1xmUAorCitOb24tYmxvY2sgbW9kZSAodmVyeSBlYXJseSBwcm9jZXNzIHdha2V1cCkuIEVhdHMgbW9yZSBDUFUuCisKKy5UUAorXGZJXC1TIDxtb2RlPlxmUCB8IFxmSVwtXC1zeW5jPTxtb2RlPlxmUAorCitTeW5jIG1vZGUgc3BlY2lmaWNhdGlvbiBmb3IgY2FwdHVyZSB0byBwbGF5YmFjayBzdHJlYW06CisgIDAgb3Igbm9uZSAgICAgICAtIGRvIG5vdCB0b3VjaCB0aGUgc3RyZWFtCisgIDEgb3Igc2ltcGxlICAgICAtIGFkZCBvciByZW1vdmUgc2FtcGxlcyB0byBrZWVwCisgICAgICAgICAgICAgICAgICAgIGJvdGggc3RyZWFtcyBzeW5jaHJvbml6ZWQKKyAgMiBvciBjYXB0c2hpZnQgIC0gdXNlIGRyaXZlciBmb3IgdGhlIGNhcHR1cmUgZGV2aWNlCisgICAgICAgICAgICAgICAgICAgIChpZiBzdXBwb3J0ZWQpIHRvIGNvbXBlbnNhdGUKKyAgICAgICAgICAgICAgICAgICAgdGhlIHJhdGUgc2hpZnQKKyAgMyBvciBwbGF5c2hpZnQgIC0gdXNlIGRyaXZlciBmb3IgdGhlIHBsYXliYWNrIGRldmljZQorICAgICAgICAgICAgICAgICAgICAoaWYgc3VwcG9ydGVkKSB0byBjb21wZW5zYXRlCisgICAgICAgICAgICAgICAgICAgIHRoZSByYXRlIHNoaWZ0CisgIDQgb3Igc2FtcGxlcmF0ZSAtIHVzZSBzYW1wbGVyYXRlIGxpYnJhcnkgdG8gZG8gcmF0ZSByZXNhbXBsaW5nCisgIDUgb3IgYXV0byAgICAgICAtIGF1dG9tYXRpY2FsbHkgc2VsZWN0cyB0aGUgYmVzdCBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgaW4gdGhpcyBvcmRlcjogY2FwdHNoaWZ0LCBwbGF5c2hpZnQsCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZXJhdGUsIHNpbXBsZQorCisuVFAKK1xmSVwtVCA8bnVtPlxmUCB8IFxmSVwtXC10aHJlYWQ9PG51bT5cZlAKKworVGhyZWFkIG51bWJlciAoLTEgbWVhbnMgY3JlYXRlIGEgdW5pcXVlIHRocmVhZCkuIEFsbCBqb2JzIHdpdGggc2FtZQordGhyZWFkIG51bWJlcnMgYXJlIHJ1biB3aXRoaW4gb25lIHRocmVhZC4KKworLlRQCitcZklcLW0gPG1peGlkPlxmUCB8IFxmSVwtXC1taXhlcj08bWlkaWQ+XGZQCisKK1JlZGlyZWN0IG1peGVyIGNvbnRyb2wgZnJvbSB0aGUgcGxheWJhY2sgY2FyZCB0byB0aGUgY2FwdHVyZSBjYXJkLiBGb3JtYXQgb2YKK1xmSW1peGlkXGZQIGlzIFNSQ0lEKFBMQVlCQUNLKVtARFNUSUQoUExBWUJBQ0spXToKKworICAibmFtZT0nTWFzdGVyIFBsYXliYWNrIFN3aXRjaCdAbmFtZT0nQW5vdGhlciBTd2l0Y2gnIgorICAibmFtZT0nUENNIFBsYXliYWNrIFZvbHVtZSciCisKK0tub3duIGF0dHJpYnV0ZXM6CisKKyAgbmFtZSAgICAgIC0gY29udHJvbCBJRCBuYW1lCisgIGluZGV4ICAgICAtIGNvbnRyb2wgSUQgaW5kZXgKKyAgZGV2aWNlICAgIC0gY29udHJvbCBJRCBkZXZpY2UKKyAgc3ViZGV2aWNlIC0gY29udHJvbCBJRCBzdWJkZXZpY2UKKyAgaWZhY2UgICAgIC0gY29udHJvbCBJRCBpbnRlcmZhY2UKKyAgbnVtaWQgICAgIC0gY29udHJvbCBJRCBudW1pZAorCisuVFAKK1xmSVwtTyA8b3NzbWl4aWQ+XGZQIHwgXGZJXC1cLW9zc21peGVyPTxtaWRpZD5cZlAKKworUmVkaXJlY3QgbWl4ZXIgY29udHJvbCBmcm9tIHRoZSBPU1MgTWl4ZXIgZW11bGF0aW9uIGxheWVyIChjYXB0dXJlIGNhcmQpCit0byB0aGUgQUxTQSBsYXllciAoY2FwdHVyZSBjYXJkKS4gRm9ybWF0IG9mIFxmSW9zc21peGlkXGZQIGlzCitBTFNBSURbLElOREVYXUBPU1NJRDoKKworICAiTWFzdGVyQFZPTFVNRSIKKyAgIlBDTSwxQEFMVFBDTSIKKworS25vd24gT1NTIGF0dHJpYnV0ZXM6CisKKyAgVk9MVU1FLCBCQVNTLCBUUkVCTEUsIFNZTlRILCBQQ00sIFNQRUFLRVIsIExJTkUsIE1JQywgQ0QsIElNSVgsIEFMVFBDTSwKKyAgUkVDTEVWLCBJR0FJTiwgT0dBSU4sIExJTkUxLCBMSU5FMiwgTElORTMsIERJR0lUQUwxLCBESUdJVEFMMiwgRElHSVRBTDMsCisgIFBIT05FSU4sIFBIT05FT1VULCBWSURFTywgUkFESU8sIE1PTklUT1IKKworLlRQCitcZklcLXZcZlAgfCBcZklcLVwtdmVyYm9zZVxmUAorCitWZXJib3NlIG1vZGUuIFVzZSBtdWx0aXBsZSB0aW1lcyB0byBpbmNyZWFzZSB2ZXJib3NpdHkuCisKKworLlRQCitcZklcLVVcZlAgfCBcZklcLVwteHJ1blxmUAorCitWZXJib3NlIHhydW4gcHJvZmlsaW5nLgorCisuVFAKK1xmSVwtVyA8dGltZW91dD5cZlAgfCBcZklcLVwtd2FrZT08dGltZW91dD5cZlAKKworU2V0IHByb2Nlc3Mgd2FrZSB0aW1lb3V0LgorCisuU0ggRVhBTVBMRVMKKworLlRQCitcZkJhbHNhbG9vcCBcLUMgaHc6MCwwIFwtUCBodzoxLDAgXC10IDUwMDAwXGZSCisKKy5TSCBCVUdTCitOb25lIGtub3duLgorLlNIIEFVVEhPUgorXGZCYWxzYWxvb3BcZlAgaXMgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4uCitUaGlzIGRvY3VtZW50IGlzIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+LgpkaWZmIC0tZ2l0IGEvYWxzYWxvb3AvYWxzYWxvb3AuYyBiL2Fsc2Fsb29wL2Fsc2Fsb29wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcxMGRkMQotLS0gL2Rldi9udWxsCisrKyBiL2Fsc2Fsb29wL2Fsc2Fsb29wLmMKQEAgLTAsMCArMSw5MjMgQEAKKy8qCisgKiAgQSBzaW1wbGUgUENNIGxvb3BiYWNrIHV0aWxpdHkgd2l0aCBhZGFwdGl2ZSBzYW1wbGUgcmF0ZSBzdXBwb3J0CisgKgorICogICAgIEF1dGhvcjogSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8YWxzYS9hc291bmRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8c3lzL3NpZ25hbC5oPgorI2luY2x1ZGUgImFsc2Fsb29wLmgiCisKK3N0cnVjdCBsb29wYmFja190aHJlYWQgeworCWludCB0aHJlYWRlZDsKKwlwdGhyZWFkX3QgdGhyZWFkOworCWludCBleGl0Y29kZTsKKwlzdHJ1Y3QgbG9vcGJhY2sgKipsb29wYmFja3M7CisJaW50IGxvb3BiYWNrc19jb3VudDsKKwlzbmRfb3V0cHV0X3QgKm91dHB1dDsKK307CisKK2ludCBxdWl0ID0gMDsKK2ludCB2ZXJib3NlID0gMDsKK2ludCB3b3JrYXJvdW5kcyA9IDA7CitpbnQgZGFlbW9uaXplID0gMDsKK2ludCB1c2Vfc3lzbG9nID0gMDsKK3N0cnVjdCBsb29wYmFjayAqKmxvb3BiYWNrcyA9IE5VTEw7CitpbnQgbG9vcGJhY2tzX2NvdW50ID0gMDsKK2NoYXIgKipteV9hcmd2ID0gTlVMTDsKK2ludCBteV9hcmdjID0gMDsKK3N0cnVjdCBsb29wYmFja190aHJlYWQgKnRocmVhZHM7CitpbnQgdGhyZWFkc19jb3VudCA9IDA7CitwdGhyZWFkX3QgbWFpbl9qb2I7CitpbnQgYXJnX2RlZmF1bHRfeHJ1biA9IDA7CitpbnQgYXJnX2RlZmF1bHRfd2FrZSA9IDA7CisKK3N0YXRpYyB2b2lkIG15X2V4aXQoc3RydWN0IGxvb3BiYWNrX3RocmVhZCAqdGhyZWFkLCBpbnQgZXhpdGNvZGUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdGhyZWFkLT5sb29wYmFja3NfY291bnQ7IGkrKykKKwkJcGNtam9iX2RvbmUodGhyZWFkLT5sb29wYmFja3NbaV0pOworCWlmICh0aHJlYWQtPnRocmVhZGVkKSB7CisJCXRocmVhZC0+ZXhpdGNvZGUgPSBleGl0Y29kZTsKKwkJcHRocmVhZF9leGl0KDApOworCX0KKwlleGl0KGV4aXRjb2RlKTsKK30KKworc3RhdGljIGludCBjcmVhdGVfbG9vcGJhY2tfaGFuZGxlKHN0cnVjdCBsb29wYmFja19oYW5kbGUgKipfaGFuZGxlLAorCQkJCSAgY29uc3QgY2hhciAqZGV2aWNlLAorCQkJCSAgY29uc3QgY2hhciAqY3RsZGV2LAorCQkJCSAgY29uc3QgY2hhciAqaWQpCit7CisJY2hhciBpZGJ1ZlsxMDI0XTsKKwlzdHJ1Y3QgbG9vcGJhY2tfaGFuZGxlICpoYW5kbGU7CisKKwloYW5kbGUgPSBjYWxsb2MoMSwgc2l6ZW9mKCpoYW5kbGUpKTsKKwlpZiAoaGFuZGxlID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWlmIChkZXZpY2UgPT0gTlVMTCkKKwkJZGV2aWNlID0gImh3OjAsMCI7CisJaGFuZGxlLT5kZXZpY2UgPSBzdHJkdXAoZGV2aWNlKTsKKwlpZiAoaGFuZGxlLT5kZXZpY2UgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGN0bGRldikgeworCQloYW5kbGUtPmN0bGRldiA9IHN0cmR1cChjdGxkZXYpOworCQlpZiAoaGFuZGxlLT5jdGxkZXYgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCX0gZWxzZSB7CisJCWhhbmRsZS0+Y3RsZGV2ID0gTlVMTDsKKwl9CisJc25wcmludGYoaWRidWYsIHNpemVvZihpZGJ1ZiktMSwgIiVzICVzIiwgaWQsIGRldmljZSk7CisJaWRidWZbc2l6ZW9mKGlkYnVmKS0xXSA9ICdcMCc7CisJaGFuZGxlLT5pZCA9IHN0cmR1cChpZGJ1Zik7CisJaGFuZGxlLT5hY2Nlc3MgPSBTTkRfUENNX0FDQ0VTU19SV19JTlRFUkxFQVZFRDsKKwloYW5kbGUtPmZvcm1hdCA9IFNORF9QQ01fRk9STUFUX1MxNl9MRTsKKwloYW5kbGUtPnJhdGUgPSBoYW5kbGUtPnJhdGVfcmVxID0gNDgwMDA7CisJaGFuZGxlLT5jaGFubmVscyA9IDI7CisJaGFuZGxlLT5yZXNhbXBsZSA9IDA7CisJKl9oYW5kbGUgPSBoYW5kbGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX2xvb3BiYWNrKHN0cnVjdCBsb29wYmFjayAqKl9oYW5kbGUsCisJCQkgICBzdHJ1Y3QgbG9vcGJhY2tfaGFuZGxlICpwbGF5LAorCQkJICAgc3RydWN0IGxvb3BiYWNrX2hhbmRsZSAqY2FwdCwKKwkJCSAgIHNuZF9vdXRwdXRfdCAqb3V0cHV0KQoreworCXN0cnVjdCBsb29wYmFjayAqaGFuZGxlOworCisJaGFuZGxlID0gY2FsbG9jKDEsIHNpemVvZigqaGFuZGxlKSk7CisJaWYgKGhhbmRsZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwloYW5kbGUtPnBsYXkgPSBwbGF5OworCWhhbmRsZS0+Y2FwdCA9IGNhcHQ7CisJcGxheS0+bG9vcGJhY2sgPSBoYW5kbGU7CisJY2FwdC0+bG9vcGJhY2sgPSBoYW5kbGU7CisJaGFuZGxlLT5sYXRlbmN5X3JlcSA9IDA7CisJaGFuZGxlLT5sYXRlbmN5X3JlcXRpbWUgPSAxMDAwMDsKKwloYW5kbGUtPmxvb3BfdGltZSA9IH4wVUw7CisJaGFuZGxlLT5sb29wX2xpbWl0ID0gfjBVTEw7CisJaGFuZGxlLT5vdXRwdXQgPSBvdXRwdXQ7CisJaGFuZGxlLT5zdGF0ZSA9IG91dHB1dDsKKyNpZmRlZiBVU0VfU0FNUExFUkFURQorCWhhbmRsZS0+c3JjX2VuYWJsZSA9IDE7CisJaGFuZGxlLT5zcmNfY29udmVydGVyX3R5cGUgPSBTUkNfU0lOQ19CRVNUX1FVQUxJVFk7CisjZW5kaWYKKwkqX2hhbmRsZSA9IGhhbmRsZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X2xvb3BfdGltZShzdHJ1Y3QgbG9vcGJhY2sgKmxvb3AsIHVuc2lnbmVkIGxvbmcgbG9vcF90aW1lKQoreworCWxvb3AtPmxvb3BfdGltZSA9IGxvb3BfdGltZTsKKwlsb29wLT5sb29wX2xpbWl0ID0gbG9vcC0+Y2FwdC0+cmF0ZSAqIGxvb3BfdGltZTsKK30KKworc3RhdGljIHZvaWQgc2V0c2NoZWR1bGVyKHZvaWQpCit7CisJc3RydWN0IHNjaGVkX3BhcmFtIHNjaGVkX3BhcmFtOworCisJaWYgKHNjaGVkX2dldHBhcmFtKDAsICZzY2hlZF9wYXJhbSkgPCAwKSB7CisJCWxvZ2l0KExPR19XQVJOSU5HLCAiU2NoZWR1bGVyIGdldHBhcmFtIGZhaWxlZC5cbiIpOworCQlyZXR1cm47CisJfQorCXNjaGVkX3BhcmFtLnNjaGVkX3ByaW9yaXR5ID0gc2NoZWRfZ2V0X3ByaW9yaXR5X21heChTQ0hFRF9SUik7CisJaWYgKCFzY2hlZF9zZXRzY2hlZHVsZXIoMCwgU0NIRURfUlIsICZzY2hlZF9wYXJhbSkpIHsKKwkJaWYgKHZlcmJvc2UpCisJCQlsb2dpdChMT0dfV0FSTklORywgIlNjaGVkdWxlciBzZXQgdG8gUm91bmQgUm9iaW4gd2l0aCBwcmlvcml0eSAlaVxuIiwgc2NoZWRfcGFyYW0uc2NoZWRfcHJpb3JpdHkpOworCQlyZXR1cm47CisJfQorCWlmICh2ZXJib3NlKQorCQlsb2dpdChMT0dfSU5GTywgIiEhIVNjaGVkdWxlciBzZXQgdG8gUm91bmQgUm9iaW4gd2l0aCBwcmlvcml0eSAlaSBGQUlMRUQhXG4iLCBzY2hlZF9wYXJhbS5zY2hlZF9wcmlvcml0eSk7Cit9CisKK3ZvaWQgaGVscCh2b2lkKQoreworCWludCBrOworCXByaW50ZigKKyJVc2FnZTogYWxzYWxvb3AgW09QVElPTl0uLi5cblxuIgorIi1oLC0taGVscCAgICAgIGhlbHBcbiIKKyItZywtLWNvbmZpZyAgICBjb25maWd1cmF0aW9uIGZpbGUgKG9uZSBsaW5lID0gb25lIGpvYiBzcGVjaWZpZWQpXG4iCisiLWQsLS1kYWVtb25pemUgZGFlbW9uaXplIHRoZSBtYWluIHByb2Nlc3MgYW5kIHVzZSBzeXNsb2cgZm9yIGVycm9yc1xuIgorIi1QLC0tcGRldmljZSAgIHBsYXliYWNrIGRldmljZVxuIgorIi1DLC0tY2RldmljZSAgIGNhcHR1cmUgZGV2aWNlXG4iCisiLVgsLS1wY3RsICAgICAgcGxheWJhY2sgY3RsIGRldmljZVxuIgorIi1ZLC0tY2N0bCAgICAgIGNhcHR1cmUgY3RsIGRldmljZVxuIgorIi1sLC0tbGF0ZW5jeSAgIHJlcXVlc3RlZCBsYXRlbmN5IGluIGZyYW1lc1xuIgorIi10LC0tdGxhdGVuY3kgIHJlcXVlc3RlZCBsYXRlbmN5IGluIHVzZWMgKDEvMTAwMDAwMHNlYylcbiIKKyItZiwtLWZvcm1hdCAgICBzYW1wbGUgZm9ybWF0XG4iCisiLWMsLS1jaGFubmVscyAgY2hhbm5lbHNcbiIKKyItciwtLXJhdGUgICAgICByYXRlXG4iCisiLW4sLS1yZXNhbXBsZSAgcmVzYW1wbGUgaW4gYWxzYS1saWJcbiIKKyItQSwtLXNhbXBsZXJhdGUgdXNlIGNvbnZlcnRlciAoMD1zaW5jYmVzdCwxPXNpbmNtZWRpdW0sMj1zaW5jZmFzdGVzdCxcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMz16ZXJvaG9sZCw0PWxpbmVhcilcbiIKKyItQiwtLWJ1ZmZlciAgICBidWZmZXIgc2l6ZSBpbiBmcmFtZXNcbiIKKyItRSwtLXBlcmlvZCAgICBwZXJpb2Qgc2l6ZSBpbiBmcmFtZXNcbiIKKyItcywtLXNlY29uZHMgICBkdXJhdGlvbiBvZiBsb29wIGluIHNlY29uZHNcbiIKKyItYiwtLW5ibG9jayAgICBub24tYmxvY2sgbW9kZSAodmVyeSBlYXJseSBwcm9jZXNzIHdha2V1cClcbiIKKyItUywtLXN5bmMgICAgICBzeW5jIG1vZGUoMD1ub25lLDE9c2ltcGxlLDI9Y2FwdHNoaWZ0LDM9cGxheXNoaWZ0LDQ9c2FtcGxlcmF0ZSxcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgNT1hdXRvKVxuIgorIi1hLC0tc2xhdmUgICAgIHN0cmVhbSBwYXJhbWV0ZXJzIHNsYXZlIG1vZGUgKDA9YXV0bywgMT1vbiwgMj1vZmYpXG4iCisiLVQsLS10aHJlYWQgICAgdGhyZWFkIG51bWJlciAoLTEgPSBjcmVhdGUgdW5pcXVlKVxuIgorIi1tLC0tbWl4ZXIJcmVkaXJlY3QgbWl4ZXIsIGFyZ3VtZW50IGlzOlxuIgorIgkJICAgIFNSQ19TTEFWRV9JRChQTEFZQkFDSylbQERTVF9TTEFWRV9JRChDQVBUVVJFKV1cbiIKKyItTywtLW9zc21peGVyCXJlc2NhbiBhbmQgcmVkaXJlY3Qgb3NzIG1peGVyLCBhcmd1bWVudCBpczpcbiIKKyIJCSAgICBBTFNBX0lEQE9TU19JRCAgKGZvciBleGFtcGxlOiBcIk1hc3RlckBWT0xVTUVcIilcbiIKKyItZSwtLWVmZmVjdCAgICBhcHBseSBhbiBlZmZlY3QgKGJhbmRwYXNzIGZpbHRlciBzd2VlcClcbiIKKyItdiwtLXZlcmJvc2UgICB2ZXJib3NlIG1vZGUgKG1vcmUgLXYgbWVhbnMgbW9yZSB2ZXJib3NlKVxuIgorIi13LC0td29ya2Fyb3VuZCB1c2Ugd29ya2Fyb3VuZCAoc2VyaWFsb3BlbilcbiIKKyItVSwtLXhydW4gICAgICB4cnVuIHByb2ZpbGluZ1xuIgorIi1XLC0td2FrZSAgICAgIHByb2Nlc3Mgd2FrZSB0aW1lb3V0IGluIG1zXG4iCispOworCXByaW50ZigiXG5SZWNvZ25pemVkIHNhbXBsZSBmb3JtYXRzIGFyZToiKTsKKwlmb3IgKGsgPSAwOyBrIDwgU05EX1BDTV9GT1JNQVRfTEFTVDsgKytrKSB7CisJCWNvbnN0IGNoYXIgKnMgPSBzbmRfcGNtX2Zvcm1hdF9uYW1lKGspOworCQlpZiAocykKKwkJCXByaW50ZigiICVzIiwgcyk7CisJfQorCXByaW50ZigiXG5cbiIpOworCXByaW50ZigKKyJUaXAgIzEgKHVzYWJsZSA1MDBtcyBsYXRlbmN5LCBnb29kIENQVSB1c2FnZSwgc3VwZXJiIHhydW4gcHJldmVudGlvbik6XG4iCisiICBhbHNhbG9vcCAtdCA1MDAwMDBcbiIKKyJUaXAgIzIgKHN1cGVyYiAxbXMgbGF0ZW5jeSwgYnV0IGhlYXZ5IENQVSB1c2FnZSk6XG4iCisiICBhbHNhbG9vcCAtdCAxMDAwXG4iCispOworfQorCitzdGF0aWMgbG9uZyB0aW1lZGlmZihzdHJ1Y3QgdGltZXZhbCB0MSwgc3RydWN0IHRpbWV2YWwgdDIpCit7CisJc2lnbmVkIGxvbmcgbDsKKworCXQxLnR2X3NlYyAtPSB0Mi50dl9zZWM7CisJbCA9IChzaWduZWQgbG9uZykgdDEudHZfdXNlYyAtIChzaWduZWQgbG9uZykgdDIudHZfdXNlYzsKKwlpZiAobCA8IDApIHsKKwkJdDEudHZfc2VjLS07CisJCWwgPSAxMDAwMDAwICsgbDsKKwkJbCAlPSAxMDAwMDAwOworCX0KKwlyZXR1cm4gKHQxLnR2X3NlYyAqIDEwMDAwMDApICsgbDsKK30KKworc3RhdGljIHZvaWQgYWRkX2xvb3Aoc3RydWN0IGxvb3BiYWNrICpsb29wKQoreworCWxvb3BiYWNrcyA9IHJlYWxsb2MobG9vcGJhY2tzLCAobG9vcGJhY2tzX2NvdW50ICsgMSkgKgorCQkJCQkJc2l6ZW9mKHN0cnVjdCBsb29wYmFjayAqKSk7CisJaWYgKGxvb3BiYWNrcyA9PSBOVUxMKSB7CisJCWxvZ2l0KExPR19DUklULCAiTm8gZW5vdWdoIG1lbW9yeVxuIik7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisJbG9vcGJhY2tzW2xvb3BiYWNrc19jb3VudCsrXSA9IGxvb3A7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9taXhlcl9jb250cm9sKHN0cnVjdCBsb29wYmFja19jb250cm9sICpjb250cm9sLAorCQkJICAgICAgY2hhciAqaWQpCit7CisJaW50IGVycjsKKworCWVyciA9IHNuZF9jdGxfZWxlbV9pZF9tYWxsb2MoJmNvbnRyb2wtPmlkKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBzbmRfY3RsX2VsZW1faW5mb19tYWxsb2MoJmNvbnRyb2wtPmluZm8pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWVyciA9IHNuZF9jdGxfZWxlbV92YWx1ZV9tYWxsb2MoJmNvbnRyb2wtPnZhbHVlKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBjb250cm9sX3BhcnNlX2lkKGlkLCBjb250cm9sLT5pZCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRkX21peGVycyhzdHJ1Y3QgbG9vcGJhY2sgKmxvb3AsCisJCSAgICAgIGNoYXIgKiptaXhlcnMsCisJCSAgICAgIGludCBtaXhlcnNfY291bnQpCit7CisJc3RydWN0IGxvb3BiYWNrX21peGVyICptaXhlciwgKmxhc3QgPSBOVUxMOworCWNoYXIgKnN0cjE7CisJaW50IGVycjsKKworCXdoaWxlIChtaXhlcnNfY291bnQgPiAwKSB7CisJCW1peGVyID0gY2FsbG9jKDEsIHNpemVvZigqbWl4ZXIpKTsKKwkJaWYgKG1peGVyID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJaWYgKGxhc3QpCisJCQlsYXN0LT5uZXh0ID0gbWl4ZXI7CisJCWVsc2UKKwkJCWxvb3AtPmNvbnRyb2xzID0gbWl4ZXI7CisJCWxhc3QgPSBtaXhlcjsKKwkJc3RyMSA9IHN0cmNocigqbWl4ZXJzLCAnQCcpOworCQlpZiAoc3RyMSkKKwkJCSpzdHIxID0gJ1wwJzsKKwkJZXJyID0gaW5pdF9taXhlcl9jb250cm9sKCZtaXhlci0+c3JjLCAqbWl4ZXJzKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWxvZ2l0KExPR19DUklULCAiV3JvbmcgbWl4ZXIgY29udHJvbCBJRCBzeW50YXggJyVzJ1xuIiwgKm1peGVycyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQllcnIgPSBpbml0X21peGVyX2NvbnRyb2woJm1peGVyLT5kc3QsIHN0cjEgPyBzdHIxICsgMSA6ICptaXhlcnMpOworCQlpZiAoZXJyIDwgMCkgeworCQkJbG9naXQoTE9HX0NSSVQsICJXcm9uZyBtaXhlciBjb250cm9sIElEIHN5bnRheCAnJXMnXG4iLCBzdHIxID8gc3RyMSArIDEgOiAqbWl4ZXJzKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChzdHIxKQorCQkJKnN0cjEgPSAnQCc7CisJCW1peGVycysrOworCQltaXhlcnNfY291bnQtLTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRkX29zc19taXhlcnMoc3RydWN0IGxvb3BiYWNrICpsb29wLAorCQkJICBjaGFyICoqbWl4ZXJzLAorCQkJICBpbnQgbWl4ZXJzX2NvdW50KQoreworCXN0cnVjdCBsb29wYmFja19vc3NtaXhlciAqbWl4ZXIsICpsYXN0ID0gTlVMTDsKKwljaGFyICpzdHIxLCAqc3RyMjsKKworCXdoaWxlIChtaXhlcnNfY291bnQgPiAwKSB7CisJCW1peGVyID0gY2FsbG9jKDEsIHNpemVvZigqbWl4ZXIpKTsKKwkJaWYgKG1peGVyID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJaWYgKGxhc3QpCisJCQlsYXN0LT5uZXh0ID0gbWl4ZXI7CisJCWVsc2UKKwkJCWxvb3AtPm9zc19jb250cm9scyA9IG1peGVyOworCQlsYXN0ID0gbWl4ZXI7CisJCXN0cjEgPSBzdHJjaHIoKm1peGVycywgJywnKTsKKwkJaWYgKHN0cjEpCisJCQkqc3RyMSA9ICdcMCc7CisJCXN0cjIgPSBzdHJjaHIoc3RyMSA/IHN0cjEgKyAxIDogKm1peGVycywgJ0AnKTsKKwkJaWYgKHN0cjIpCisJCQkqc3RyMiA9ICdcMCc7CisJCW1peGVyLT5hbHNhX2lkID0gc3RyZHVwKCptaXhlcnMpOworCQlpZiAoc3RyMSkKKwkJCW1peGVyLT5hbHNhX2luZGV4ID0gYXRvaShzdHIxKTsKKwkJbWl4ZXItPm9zc19pZCA9IHN0cmR1cChzdHIyID8gc3RyMiArIDEgOiAqbWl4ZXJzKTsKKwkJaWYgKG1peGVyLT5hbHNhX2lkID09IE5VTEwgfHwgbWl4ZXItPm9zc19pZCA9PSBOVUxMKSB7CisJCQlsb2dpdChMT0dfQ1JJVCwgIk5vdCBlbm91Z2ggbWVtb3J5Iik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlpZiAoc3RyMSkKKwkJCSpzdHIxID0gJywnOworCQlpZiAoc3RyMikKKwkJCSpzdHIyID0gJywnOworCQltaXhlcnMrKzsKKwkJbWl4ZXJzX2NvdW50LS07CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX2NvbmZpZ19maWxlKGNvbnN0IGNoYXIgKmZpbGUsIHNuZF9vdXRwdXRfdCAqb3V0cHV0KTsKKworc3RhdGljIGludCBwYXJzZV9jb25maWcoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgc25kX291dHB1dF90ICpvdXRwdXQsCisJCQlpbnQgY21kbGluZSkKK3sKKwlzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uW10gPQorCXsKKwkJeyJoZWxwIiwgMCwgTlVMTCwgJ2gnfSwKKwkJeyJjb25maWciLCAxLCBOVUxMLCAnZyd9LAorCQl7ImRhZW1vbml6ZSIsIDAsIE5VTEwsICdkJ30sCisJCXsicGRldmljZSIsIDEsIE5VTEwsICdQJ30sCisJCXsiY2RldmljZSIsIDEsIE5VTEwsICdDJ30sCisJCXsicGN0bCIsIDEsIE5VTEwsICdYJ30sCisJCXsiY2N0bCIsIDEsIE5VTEwsICdZJ30sCisJCXsibGF0ZW5jeSIsIDEsIE5VTEwsICdsJ30sCisJCXsidGxhdGVuY3kiLCAxLCBOVUxMLCAndCd9LAorCQl7ImZvcm1hdCIsIDEsIE5VTEwsICdmJ30sCisJCXsiY2hhbm5lbHMiLCAxLCBOVUxMLCAnYyd9LAorCQl7InJhdGUiLCAxLCBOVUxMLCAncid9LAorCQl7ImJ1ZmZlciIsIDEsIE5VTEwsICdCJ30sCisJCXsicGVyaW9kIiwgMSwgTlVMTCwgJ0UnfSwKKwkJeyJzZWNvbmRzIiwgMSwgTlVMTCwgJ3MnfSwKKwkJeyJuYmxvY2siLCAwLCBOVUxMLCAnYid9LAorCQl7ImVmZmVjdCIsIDAsIE5VTEwsICdlJ30sCisJCXsidmVyYm9zZSIsIDAsIE5VTEwsICd2J30sCisJCXsicmVzYW1wbGUiLCAwLCBOVUxMLCAnbid9LAorCQl7InNhbXBsZXJhdGUiLCAxLCBOVUxMLCAnQSd9LAorCQl7InN5bmMiLCAxLCBOVUxMLCAnUyd9LAorCQl7InNsYXZlIiwgMSwgTlVMTCwgJ2EnfSwKKwkJeyJ0aHJlYWQiLCAxLCBOVUxMLCAnVCd9LAorCQl7Im1peGVyIiwgMSwgTlVMTCwgJ20nfSwKKwkJeyJvc3NtaXhlciIsIDEsIE5VTEwsICdPJ30sCisJCXsid29ya2Fyb3VuZCIsIDEsIE5VTEwsICd3J30sCisJCXsieHJ1biIsIDAsIE5VTEwsICdVJ30sCisJCXtOVUxMLCAwLCBOVUxMLCAwfSwKKwl9OworCWludCBlcnIsIG1vcmVoZWxwOworCWNoYXIgKmFyZ19jb25maWcgPSBOVUxMOworCWNoYXIgKmFyZ19wZGV2aWNlID0gTlVMTDsKKwljaGFyICphcmdfY2RldmljZSA9IE5VTEw7CisJY2hhciAqYXJnX3BjdGwgPSBOVUxMOworCWNoYXIgKmFyZ19jY3RsID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgYXJnX2xhdGVuY3lfcmVxID0gMDsKKwl1bnNpZ25lZCBpbnQgYXJnX2xhdGVuY3lfcmVxdGltZSA9IDEwMDAwOworCXNuZF9wY21fZm9ybWF0X3QgYXJnX2Zvcm1hdCA9IFNORF9QQ01fRk9STUFUX1MxNl9MRTsKKwl1bnNpZ25lZCBpbnQgYXJnX2NoYW5uZWxzID0gMjsKKwl1bnNpZ25lZCBpbnQgYXJnX3JhdGUgPSA0ODAwMDsKKwlzbmRfcGNtX3VmcmFtZXNfdCBhcmdfYnVmZmVyX3NpemUgPSAwOworCXNuZF9wY21fdWZyYW1lc190IGFyZ19wZXJpb2Rfc2l6ZSA9IDA7CisJdW5zaWduZWQgbG9uZyBhcmdfbG9vcF90aW1lID0gfjBVTDsKKwlpbnQgYXJnX25ibG9jayA9IDA7CisJaW50IGFyZ19lZmZlY3QgPSAwOworCWludCBhcmdfcmVzYW1wbGUgPSAwOworCWludCBhcmdfc2FtcGxlcmF0ZSA9IFNSQ19TSU5DX0ZBU1RFU1QgKyAxOworCWludCBhcmdfc3luYyA9IFNZTkNfVFlQRV9BVVRPOworCWludCBhcmdfc2xhdmUgPSBTTEFWRV9UWVBFX0FVVE87CisJaW50IGFyZ190aHJlYWQgPSAwOworCXN0cnVjdCBsb29wYmFjayAqbG9vcCA9IE5VTEw7CisJY2hhciAqYXJnX21peGVyc1tNQVhfTUlYRVJTXTsKKwlpbnQgYXJnX21peGVyc19jb3VudCA9IDA7CisJY2hhciAqYXJnX29zc21peGVyc1tNQVhfTUlYRVJTXTsKKwlpbnQgYXJnX29zc21peGVyc19jb3VudCA9IDA7CisJaW50IGFyZ194cnVuID0gYXJnX2RlZmF1bHRfeHJ1bjsKKwlpbnQgYXJnX3dha2UgPSBhcmdfZGVmYXVsdF93YWtlOworCisJbW9yZWhlbHAgPSAwOworCXdoaWxlICgxKSB7CisJCWludCBjOworCQlpZiAoKGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LAorCQkJCSJoZGc6UDpDOlg6WTpsOnQ6RjpmOmM6cjpzOmJlbnZBOlM6YTptOlQ6Tzp3OlVXOiIsCisJCQkJbG9uZ19vcHRpb24sIE5VTEwpKSA8IDApCisJCQlicmVhazsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ2gnOgorCQkJbW9yZWhlbHArKzsKKwkJCWJyZWFrOworCQljYXNlICdnJzoKKwkJCWFyZ19jb25maWcgPSBzdHJkdXAob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCWRhZW1vbml6ZSA9IDE7CisJCQl1c2Vfc3lzbG9nID0gMTsKKwkJCW9wZW5sb2coImFsc2Fsb29wIiwgTE9HX05ERUxBWXxMT0dfUElELCBMT0dfREFFTU9OKTsKKwkJCWJyZWFrOworCQljYXNlICdQJzoKKwkJCWFyZ19wZGV2aWNlID0gc3RyZHVwKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnQyc6CisJCQlhcmdfY2RldmljZSA9IHN0cmR1cChvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ1gnOgorCQkJYXJnX3BjdGwgPSBzdHJkdXAob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdZJzoKKwkJCWFyZ19jY3RsID0gc3RyZHVwKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQllcnIgPSBhdG9pKG9wdGFyZyk7CisJCQlhcmdfbGF0ZW5jeV9yZXEgPSBlcnIgPj0gNCA/IGVyciA6IDQ7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQllcnIgPSBhdG9pKG9wdGFyZyk7CisJCQlhcmdfbGF0ZW5jeV9yZXF0aW1lID0gZXJyID49IDUwMCA/IGVyciA6IDUwMDsKKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCWFyZ19mb3JtYXQgPSBzbmRfcGNtX2Zvcm1hdF92YWx1ZShvcHRhcmcpOworCQkJaWYgKGFyZ19mb3JtYXQgPT0gU05EX1BDTV9GT1JNQVRfVU5LTk9XTikgeworCQkJCWxvZ2l0KExPR19XQVJOSU5HLCAiVW5rbm93biBmb3JtYXQsIHNldHRpbmcgdG8gZGVmYXVsdCBTMTZfTEVcbiIpOworCQkJCWFyZ19mb3JtYXQgPSBTTkRfUENNX0ZPUk1BVF9TMTZfTEU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnYyc6CisJCQllcnIgPSBhdG9pKG9wdGFyZyk7CisJCQlhcmdfY2hhbm5lbHMgPSBlcnIgPj0gMSAmJiBlcnIgPCAxMDI0ID8gZXJyIDogMTsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCWVyciA9IGF0b2kob3B0YXJnKTsKKwkJCWFyZ19yYXRlID0gZXJyID49IDQwMDAgJiYgZXJyIDwgMjAwMDAwID8gZXJyIDogNDQxMDA7CisJCQlicmVhazsKKwkJY2FzZSAnQic6CisJCQllcnIgPSBhdG9pKG9wdGFyZyk7CisJCQlhcmdfYnVmZmVyX3NpemUgPSBlcnIgPj0gMzIgJiYgZXJyIDwgMjAwMDAwID8gZXJyIDogMDsKKwkJCWJyZWFrOworCQljYXNlICdFJzoKKwkJCWVyciA9IGF0b2kob3B0YXJnKTsKKwkJCWFyZ19wZXJpb2Rfc2l6ZSA9IGVyciA+PSAzMiAmJiBlcnIgPCAyMDAwMDAgPyBlcnIgOiAwOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJZXJyID0gYXRvaShvcHRhcmcpOworCQkJYXJnX2xvb3BfdGltZSA9IGVyciA+PSAxICYmIGVyciA8PSAxMDAwMDAgPyBlcnIgOiAzMDsKKwkJCWJyZWFrOworCQljYXNlICdiJzoKKwkJCWFyZ19uYmxvY2sgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2UnOgorCQkJYXJnX2VmZmVjdCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnbic6CisJCQlhcmdfcmVzYW1wbGUgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ0EnOgorCQkJaWYgKHN0cmNhc2VjbXAob3B0YXJnLCAic2luY2Jlc3QiKSA9PSAwKQorCQkJCWFyZ19zYW1wbGVyYXRlID0gU1JDX1NJTkNfQkVTVF9RVUFMSVRZOworCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChvcHRhcmcsICJzaW5jbWVkaXVtIikgPT0gMCkKKwkJCQlhcmdfc2FtcGxlcmF0ZSA9IFNSQ19TSU5DX01FRElVTV9RVUFMSVRZOworCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChvcHRhcmcsICJzaW5jZmFzdGVzdCIpID09IDApCisJCQkJYXJnX3NhbXBsZXJhdGUgPSBTUkNfU0lOQ19GQVNURVNUOworCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChvcHRhcmcsICJ6ZXJvaG9sZCIpID09IDApCisJCQkJYXJnX3NhbXBsZXJhdGUgPSBTUkNfWkVST19PUkRFUl9IT0xEOworCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChvcHRhcmcsICJsaW5lYXIiKSA9PSAwKQorCQkJCWFyZ19zYW1wbGVyYXRlID0gU1JDX0xJTkVBUjsKKwkJCWVsc2UKKwkJCQlhcmdfc2FtcGxlcmF0ZSA9IGF0b2kob3B0YXJnKTsKKwkJCWlmIChhcmdfc2FtcGxlcmF0ZSA8IDAgfHwgYXJnX3NhbXBsZXJhdGUgPiBTUkNfTElORUFSKQorCQkJCWFyZ19zeW5jID0gU1JDX1NJTkNfRkFTVEVTVDsKKwkJCWFyZ19zYW1wbGVyYXRlICs9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnUyc6CisJCQlpZiAoc3RyY2FzZWNtcChvcHRhcmcsICJzYW1wbGVyYXRlIikgPT0gMCkKKwkJCQlhcmdfc3luYyA9IFNZTkNfVFlQRV9TQU1QTEVSQVRFOworCQkJZWxzZSBpZiAob3B0YXJnWzBdID09ICduJykKKwkJCQlhcmdfc3luYyA9IFNZTkNfVFlQRV9OT05FOworCQkJZWxzZSBpZiAob3B0YXJnWzBdID09ICdzJykKKwkJCQlhcmdfc3luYyA9IFNZTkNfVFlQRV9TSU1QTEU7CisJCQllbHNlIGlmIChvcHRhcmdbMF0gPT0gJ2MnKQorCQkJCWFyZ19zeW5jID0gU1lOQ19UWVBFX0NBUFRSQVRFU0hJRlQ7CisJCQllbHNlIGlmIChvcHRhcmdbMF0gPT0gJ3AnKQorCQkJCWFyZ19zeW5jID0gU1lOQ19UWVBFX1BMQVlSQVRFU0hJRlQ7CisJCQllbHNlIGlmIChvcHRhcmdbMF0gPT0gJ3InKQorCQkJCWFyZ19zeW5jID0gU1lOQ19UWVBFX1NBTVBMRVJBVEU7CisJCQllbHNlCisJCQkJYXJnX3N5bmMgPSBhdG9pKG9wdGFyZyk7CisJCQlpZiAoYXJnX3N5bmMgPCAwIHx8IGFyZ19zeW5jID4gU1lOQ19UWVBFX0xBU1QpCisJCQkJYXJnX3N5bmMgPSBTWU5DX1RZUEVfQVVUTzsKKwkJCWJyZWFrOworCQljYXNlICdhJzoKKwkJCWlmIChvcHRhcmdbMF0gPT0gJ2EnKQorCQkJCWFyZ19zbGF2ZSA9IFNMQVZFX1RZUEVfQVVUTzsKKwkJCWVsc2UgaWYgKHN0cmNhc2VjbXAob3B0YXJnLCAib24iKSA9PSAwKQorCQkJCWFyZ19zbGF2ZSA9IFNMQVZFX1RZUEVfT047CisJCQllbHNlIGlmIChzdHJjYXNlY21wKG9wdGFyZywgIm9mZiIpID09IDApCisJCQkJYXJnX3NsYXZlID0gU0xBVkVfVFlQRV9PRkY7CisJCQllbHNlCisJCQkJYXJnX3NsYXZlID0gYXRvaShvcHRhcmcpOworCQkJaWYgKGFyZ19zbGF2ZSA8IDAgfHwgYXJnX3NsYXZlID4gU0xBVkVfVFlQRV9MQVNUKQorCQkJCWFyZ19zbGF2ZSA9IFNMQVZFX1RZUEVfQVVUTzsKKwkJCWJyZWFrOworCQljYXNlICdUJzoKKwkJCWFyZ190aHJlYWQgPSBhdG9pKG9wdGFyZyk7CisJCQlpZiAoYXJnX3RocmVhZCA8IDApCisJCQkJYXJnX3RocmVhZCA9IDEwMDAwMDAwICsgbG9vcGJhY2tzX2NvdW50OworCQkJYnJlYWs7CisJCWNhc2UgJ20nOgorCQkJaWYgKGFyZ19taXhlcnNfY291bnQgPj0gTUFYX01JWEVSUykgeworCQkJCWxvZ2l0KExPR19DUklULCAiTWF4aW11bSByZWRpcmVjdGVkIG1peGVyIGNvbnRyb2xzIHJlYWNoZWQgKG1heCAlaSlcbiIsIChpbnQpTUFYX01JWEVSUyk7CisJCQkJZXhpdChFWElUX0ZBSUxVUkUpOworCQkJfQorCQkJYXJnX21peGVyc1thcmdfbWl4ZXJzX2NvdW50KytdID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ08nOgorCQkJaWYgKGFyZ19vc3NtaXhlcnNfY291bnQgPj0gTUFYX01JWEVSUykgeworCQkJCWxvZ2l0KExPR19DUklULCAiTWF4aW11bSByZWRpcmVjdGVkIG1peGVyIGNvbnRyb2xzIHJlYWNoZWQgKG1heCAlaSlcbiIsIChpbnQpTUFYX01JWEVSUyk7CisJCQkJZXhpdChFWElUX0ZBSUxVUkUpOworCQkJfQorCQkJYXJnX29zc21peGVyc1thcmdfb3NzbWl4ZXJzX2NvdW50KytdID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ3YnOgorCQkJdmVyYm9zZSsrOworCQkJYnJlYWs7CisJCWNhc2UgJ3cnOgorCQkJaWYgKHN0cmNhc2VjbXAob3B0YXJnLCAic2VyaWFsb3BlbiIpID09IDApCisJCQkJd29ya2Fyb3VuZHMgfD0gV09SS0FST1VORF9TRVJJQUxPUEVOOworCQkJYnJlYWs7CisJCWNhc2UgJ1UnOgorCQkJYXJnX3hydW4gPSAxOworCQkJaWYgKGNtZGxpbmUpCisJCQkJYXJnX2RlZmF1bHRfeHJ1biA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnVyc6CisJCQlhcmdfd2FrZSA9IGF0b2kob3B0YXJnKTsKKwkJCWlmIChjbWRsaW5lKQorCQkJCWFyZ19kZWZhdWx0X3dha2UgPSBhcmdfd2FrZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKG1vcmVoZWxwKSB7CisJCWhlbHAoKTsKKwkJZXhpdChFWElUX1NVQ0NFU1MpOworCX0KKwlpZiAoYXJnX2NvbmZpZyA9PSBOVUxMKSB7CisJCXN0cnVjdCBsb29wYmFja19oYW5kbGUgKnBsYXk7CisJCXN0cnVjdCBsb29wYmFja19oYW5kbGUgKmNhcHQ7CisJCWVyciA9IGNyZWF0ZV9sb29wYmFja19oYW5kbGUoJnBsYXksIGFyZ19wZGV2aWNlLCBhcmdfcGN0bCwgInBsYXliYWNrIik7CisJCWlmIChlcnIgPCAwKSB7CisJCQlsb2dpdChMT0dfQ1JJVCwgIlVuYWJsZSB0byBjcmVhdGUgcGxheWJhY2sgaGFuZGxlLlxuIik7CisJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJCX0KKwkJZXJyID0gY3JlYXRlX2xvb3BiYWNrX2hhbmRsZSgmY2FwdCwgYXJnX2NkZXZpY2UsIGFyZ19jY3RsLCAiY2FwdHVyZSIpOworCQlpZiAoZXJyIDwgMCkgeworCQkJbG9naXQoTE9HX0NSSVQsICJVbmFibGUgdG8gY3JlYXRlIGNhcHR1cmUgaGFuZGxlLlxuIik7CisJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJCX0KKwkJZXJyID0gY3JlYXRlX2xvb3BiYWNrKCZsb29wLCBwbGF5LCBjYXB0LCBvdXRwdXQpOworCQlpZiAoZXJyIDwgMCkgeworCQkJbG9naXQoTE9HX0NSSVQsICJVbmFibGUgdG8gY3JlYXRlIGxvb3BiYWNrIGhhbmRsZS5cbiIpOworCQkJZXhpdChFWElUX0ZBSUxVUkUpOworCQl9CisJCXBsYXktPmZvcm1hdCA9IGNhcHQtPmZvcm1hdCA9IGFyZ19mb3JtYXQ7CisJCXBsYXktPnJhdGUgPSBwbGF5LT5yYXRlX3JlcSA9IGNhcHQtPnJhdGUgPSBjYXB0LT5yYXRlX3JlcSA9IGFyZ19yYXRlOworCQlwbGF5LT5jaGFubmVscyA9IGNhcHQtPmNoYW5uZWxzID0gYXJnX2NoYW5uZWxzOworCQlwbGF5LT5idWZmZXJfc2l6ZV9yZXEgPSBjYXB0LT5idWZmZXJfc2l6ZV9yZXEgPSBhcmdfYnVmZmVyX3NpemU7CisJCXBsYXktPnBlcmlvZF9zaXplX3JlcSA9IGNhcHQtPnBlcmlvZF9zaXplX3JlcSA9IGFyZ19wZXJpb2Rfc2l6ZTsKKwkJcGxheS0+cmVzYW1wbGUgPSBjYXB0LT5yZXNhbXBsZSA9IGFyZ19yZXNhbXBsZTsKKwkJcGxheS0+bmJsb2NrID0gY2FwdC0+bmJsb2NrID0gYXJnX25ibG9jayA/IDEgOiAwOworCQlsb29wLT5sYXRlbmN5X3JlcSA9IGFyZ19sYXRlbmN5X3JlcTsKKwkJbG9vcC0+bGF0ZW5jeV9yZXF0aW1lID0gYXJnX2xhdGVuY3lfcmVxdGltZTsKKwkJbG9vcC0+c3luYyA9IGFyZ19zeW5jOworCQlsb29wLT5zbGF2ZSA9IGFyZ19zbGF2ZTsKKwkJbG9vcC0+dGhyZWFkID0gYXJnX3RocmVhZDsKKwkJbG9vcC0+eHJ1biA9IGFyZ194cnVuOworCQlsb29wLT53YWtlID0gYXJnX3dha2U7CisJCWVyciA9IGFkZF9taXhlcnMobG9vcCwgYXJnX21peGVycywgYXJnX21peGVyc19jb3VudCk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlsb2dpdChMT0dfQ1JJVCwgIlVuYWJsZSB0byBhZGQgbWl4ZXIgY29udHJvbHMuXG4iKTsKKwkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwkJfQorCQllcnIgPSBhZGRfb3NzX21peGVycyhsb29wLCBhcmdfb3NzbWl4ZXJzLCBhcmdfb3NzbWl4ZXJzX2NvdW50KTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWxvZ2l0KExPR19DUklULCAiVW5hYmxlIHRvIGFkZCBvc3NtaXhlciBjb250cm9scy5cbiIpOworCQkJZXhpdChFWElUX0ZBSUxVUkUpOworCQl9CisjaWZkZWYgVVNFX1NBTVBMRVJBVEUKKwkJbG9vcC0+c3JjX2VuYWJsZSA9IGFyZ19zYW1wbGVyYXRlID4gMDsKKwkJaWYgKGxvb3AtPnNyY19lbmFibGUpCisJCQlsb29wLT5zcmNfY29udmVydGVyX3R5cGUgPSBhcmdfc2FtcGxlcmF0ZSAtIDE7CisjZWxzZQorCQlpZiAoYXJnX3NhbXBsZXJhdGUgPiAwKSB7CisJCQlsb2dpdChMT0dfQ1JJVCwgIk5vIGxpYnNhbXBsZXJhdGUgc3VwcG9ydC5cbiIpOworCQkJZXhpdChFWElUX0ZBSUxVUkUpOworCQl9CisjZW5kaWYKKwkJc2V0X2xvb3BfdGltZShsb29wLCBhcmdfbG9vcF90aW1lKTsKKwkJYWRkX2xvb3AobG9vcCk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBwYXJzZV9jb25maWdfZmlsZShhcmdfY29uZmlnLCBvdXRwdXQpOworfQorCitzdGF0aWMgaW50IHBhcnNlX2NvbmZpZ19maWxlKGNvbnN0IGNoYXIgKmZpbGUsIHNuZF9vdXRwdXRfdCAqb3V0cHV0KQoreworCUZJTEUgKmZwOworCWNoYXIgbGluZVsyMDQ4XSwgd29yZFsyMDQ4XTsKKwljaGFyICpzdHIsICpwdHI7CisJaW50IGFyZ2MsIGMsIGVyciA9IDA7CisJY2hhciAqKmFyZ3Y7CisKKwlmcCA9IGZvcGVuKGZpbGUsICJyIik7CisJaWYgKGZwID09IE5VTEwpIHsKKwkJbG9naXQoTE9HX0NSSVQsICJVbmFibGUgdG8gb3BlbiBmaWxlICclcyc6ICVzXG4iLCBmaWxlLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJd2hpbGUgKCFmZW9mKGZwKSkgeworCQlpZiAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLTEsIGZwKSA9PSBOVUxMKQorCQkJYnJlYWs7CisJCWxpbmVbc2l6ZW9mKGxpbmUpLTFdID0gJ1wwJzsKKwkJbXlfYXJndiA9IHJlYWxsb2MobXlfYXJndiwgbXlfYXJnYyArIE1BWF9BUkdTICogc2l6ZW9mKGNoYXIgKikpOworCQlpZiAobXlfYXJndiA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWFyZ3YgPSBteV9hcmd2ICsgbXlfYXJnYzsKKwkJYXJnYyA9IDA7CisJCWFyZ3ZbYXJnYysrXSA9IHN0cmR1cCgiPHByb2c+Iik7CisJCW15X2FyZ2MrKzsKKwkJc3RyID0gbGluZTsKKwkJd2hpbGUgKCpzdHIpIHsKKwkJCXB0ciA9IHdvcmQ7CisJCQl3aGlsZSAoKnN0ciAmJiAoKnN0ciA9PSAnICcgfHwgKnN0ciA8ICcgJykpCisJCQkJc3RyKys7CisJCQlpZiAoKnN0ciA9PSAnIycpCisJCQkJZ290byBfX25leHQ7CisJCQlpZiAoKnN0ciA9PSAnXCcnIHx8ICpzdHIgPT0gJ1wiJykgeworCQkJCWMgPSAqc3RyKys7CisJCQkJd2hpbGUgKCpzdHIgJiYgKnN0ciAhPSBjKQorCQkJCQkqcHRyKysgPSAqc3RyKys7CisJCQkJaWYgKCpzdHIgPT0gYykKKwkJCQkJc3RyKys7CisJCQl9IGVsc2UgeworCQkJCXdoaWxlICgqc3RyICYmICpzdHIgIT0gJyAnICYmICpzdHIgIT0gJ1x0JykKKwkJCQkJKnB0cisrID0gKnN0cisrOworCQkJfQorCQkJaWYgKHB0ciAhPSB3b3JkKSB7CisJCQkJaWYgKCoocHRyLTEpID09ICdcbicpCisJCQkJCXB0ci0tOworCQkJCSpwdHIgPSAnXDAnOworCQkJCWlmIChhcmdjID49IE1BWF9BUkdTKSB7CisJCQkJCWxvZ2l0KExPR19DUklULCAiVG9vIG1hbnkgYXJndW1lbnRzLiIpOworCQkJCQlnb3RvIF9fZXJyb3I7CisJCQkJfQorCQkJCWFyZ3ZbYXJnYysrXSA9IHN0cmR1cCh3b3JkKTsKKwkJCQlteV9hcmdjKys7CisJCQl9CisJCX0KKwkJLyogZXJhc2UgcnVudGltZSB2YXJpYWJsZXMgZm9yIGdldG9wdCAqLworCQlvcHRhcmcgPSBOVUxMOworCQlvcHRpbmQgPSBvcHRlcnIgPSAxOworCQlvcHRvcHQgPSAnPyc7CisKKwkJZXJyID0gcGFyc2VfY29uZmlnKGFyZ2MsIGFyZ3YsIG91dHB1dCwgMCk7CisJICAgICAgX19uZXh0OgorCQlpZiAoZXJyIDwgMCkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCX0KKyAgICAgIF9fZXJyb3I6CisJZmNsb3NlKGZwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHRocmVhZF9qb2IxKHZvaWQgKl9kYXRhKQoreworCXN0cnVjdCBsb29wYmFja190aHJlYWQgKnRocmVhZCA9IF9kYXRhOworCXNuZF9vdXRwdXRfdCAqb3V0cHV0ID0gdGhyZWFkLT5vdXRwdXQ7CisJc3RydWN0IHBvbGxmZCAqcGZkcyA9IE5VTEw7CisJaW50IHBmZHNfY291bnQgPSAwOworCWludCBpLCBqLCBlcnIsIHdha2UgPSAxMDAwMDAwOworCisJc2V0c2NoZWR1bGVyKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdGhyZWFkLT5sb29wYmFja3NfY291bnQ7IGkrKykgeworCQllcnIgPSBwY21qb2JfaW5pdCh0aHJlYWQtPmxvb3BiYWNrc1tpXSk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlsb2dpdChMT0dfQ1JJVCwgIkxvb3BiYWNrIGluaXRpYWxpemF0aW9uIGZhaWx1cmUuXG4iKTsKKwkJCW15X2V4aXQodGhyZWFkLCBFWElUX0ZBSUxVUkUpOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCB0aHJlYWQtPmxvb3BiYWNrc19jb3VudDsgaSsrKSB7CisJCWVyciA9IHBjbWpvYl9zdGFydCh0aHJlYWQtPmxvb3BiYWNrc1tpXSk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlsb2dpdChMT0dfQ1JJVCwgIkxvb3BiYWNrIHN0YXJ0IGZhaWx1cmUuXG4iKTsKKwkJCW15X2V4aXQodGhyZWFkLCBFWElUX0ZBSUxVUkUpOworCQl9CisJCXBmZHNfY291bnQgKz0gdGhyZWFkLT5sb29wYmFja3NbaV0tPnBvbGxmZF9jb3VudDsKKwkJaiA9IHRocmVhZC0+bG9vcGJhY2tzW2ldLT53YWtlOworCQlpZiAoaiA+IDAgJiYgaiA8IHdha2UpCisJCQl3YWtlID0gajsKKwl9CisJaWYgKHdha2UgPj0gMTAwMDAwMCkKKwkJd2FrZSA9IC0xOworCXBmZHMgPSBjYWxsb2MocGZkc19jb3VudCwgc2l6ZW9mKHN0cnVjdCBwb2xsZmQpKTsKKwlpZiAocGZkcyA9PSBOVUxMIHx8IHBmZHNfY291bnQgPD0gMCkgeworCQlsb2dpdChMT0dfQ1JJVCwgIlBvbGwgRkRzIGFsbG9jYXRpb24gZmFpbGVkLlxuIik7CisJCW15X2V4aXQodGhyZWFkLCBFWElUX0ZBSUxVUkUpOworCX0KKwl3aGlsZSAoIXF1aXQpIHsKKwkJc3RydWN0IHRpbWV2YWwgdHYxLCB0djI7CisJCWZvciAoaSA9IGogPSAwOyBpIDwgdGhyZWFkLT5sb29wYmFja3NfY291bnQ7IGkrKykgeworCQkJZXJyID0gcGNtam9iX3BvbGxmZHNfaW5pdCh0aHJlYWQtPmxvb3BiYWNrc1tpXSwgJnBmZHNbal0pOworCQkJaWYgKGVyciA8IDApIHsKKwkJCQlsb2dpdChMT0dfQ1JJVCwgIlBvbGwgRkQgaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7CisJCQkJbXlfZXhpdCh0aHJlYWQsIEVYSVRfRkFJTFVSRSk7CisJCQl9CisJCQlqICs9IGVycjsKKwkJfQorCQlpZiAodmVyYm9zZSA+IDEwKQorCQkJZ2V0dGltZW9mZGF5KCZ0djEsIE5VTEwpOworCQllcnIgPSBwb2xsKHBmZHMsIGosIHdha2UpOworCQlpZiAoZXJyIDwgMCkKKwkJCWVyciA9IC1lcnJubzsKKwkJaWYgKHZlcmJvc2UgPiAxMCkgeworCQkJZ2V0dGltZW9mZGF5KCZ0djIsIE5VTEwpOworCQkJc25kX291dHB1dF9wcmludGYob3V0cHV0LCAicG9vbCB0b29rICVsaXVzXG4iLCB0aW1lZGlmZih0djIsIHR2MSkpOworCQl9CisJCWlmIChlcnIgPCAwKSB7CisJCQlpZiAoZXJyID09IC1FSU5UUiB8fCBlcnIgPT0gLUVSRVNUQVJUKQorCQkJCWNvbnRpbnVlOworCQkJbG9naXQoTE9HX0NSSVQsICJQb2xsIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKC1lcnIpKTsKKwkJCW15X2V4aXQodGhyZWFkLCBFWElUX0ZBSUxVUkUpOworCQl9CisJCWZvciAoaSA9IGogPSAwOyBpIDwgdGhyZWFkLT5sb29wYmFja3NfY291bnQ7IGkrKykgeworCQkJc3RydWN0IGxvb3BiYWNrICpsb29wID0gdGhyZWFkLT5sb29wYmFja3NbaV07CisJCQlpZiAoaiA8IGxvb3AtPmFjdGl2ZV9wb2xsZmRfY291bnQpIHsKKwkJCQllcnIgPSBwY21qb2JfcG9sbGZkc19oYW5kbGUobG9vcCwgJnBmZHNbal0pOworCQkJCWlmIChlcnIgPCAwKSB7CisJCQkJCWxvZ2l0KExPR19DUklULCAicGNtam9iIGZhaWxlZC5cbiIpOworCQkJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJCQkJfQorCQkJfQorCQkJaiArPSBsb29wLT5hY3RpdmVfcG9sbGZkX2NvdW50OworCQl9CisJfQorCisJbXlfZXhpdCh0aHJlYWQsIEVYSVRfU1VDQ0VTUyk7Cit9CisKK3N0YXRpYyB2b2lkIHRocmVhZF9qb2Ioc3RydWN0IGxvb3BiYWNrX3RocmVhZCAqdGhyZWFkKQoreworCWlmICghdGhyZWFkLT50aHJlYWRlZCkgeworCQl0aHJlYWRfam9iMSh0aHJlYWQpOworCQlyZXR1cm47CisJfQorCXB0aHJlYWRfY3JlYXRlKCZ0aHJlYWQtPnRocmVhZCwgTlVMTCwgKHZvaWQgKikgJnRocmVhZF9qb2IxLAorCQkJCQkgICAgICAodm9pZCAqKSB0aHJlYWQpOworfQorCitzdGF0aWMgdm9pZCBzZW5kX3RvX2FsbChpbnQgc2lnKQoreworCXN0cnVjdCBsb29wYmFja190aHJlYWQgKnRocmVhZDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB0aHJlYWRzX2NvdW50OyBpKyspIHsKKwkJdGhyZWFkID0gJnRocmVhZHNbaV07CisJCWlmICh0aHJlYWQtPnRocmVhZGVkKQorCQkJcHRocmVhZF9raWxsKHRocmVhZC0+dGhyZWFkLCBzaWcpOworCX0KK30KKworc3RhdGljIHZvaWQgc2lnbmFsX2hhbmRsZXIoaW50IHNpZykKK3sKKwlxdWl0ID0gMTsKKwlzZW5kX3RvX2FsbChTSUdVU1IyKTsKK30KKworc3RhdGljIHZvaWQgc2lnbmFsX2hhbmRsZXJfc3RhdGUoaW50IHNpZykKK3sKKwlwdGhyZWFkX3Qgc2VsZiA9IHB0aHJlYWRfc2VsZigpOworCXN0cnVjdCBsb29wYmFja190aHJlYWQgKnRocmVhZDsKKwlpbnQgaSwgajsKKworCWlmIChwdGhyZWFkX2VxdWFsKG1haW5fam9iLCBzZWxmKSkKKwkJc2VuZF90b19hbGwoU0lHVVNSMSk7CisJZm9yIChpID0gMDsgaSA8IHRocmVhZHNfY291bnQ7IGkrKykgeworCQl0aHJlYWQgPSAmdGhyZWFkc1tpXTsKKwkJaWYgKHRocmVhZC0+dGhyZWFkID09IHNlbGYpIHsKKwkJCWZvciAoaiA9IDA7IGogPCB0aHJlYWQtPmxvb3BiYWNrc19jb3VudDsgaisrKQorCQkJCXBjbWpvYl9zdGF0ZSh0aHJlYWQtPmxvb3BiYWNrc1tqXSk7CisJCX0KKwl9CisJc2lnbmFsKHNpZywgc2lnbmFsX2hhbmRsZXJfc3RhdGUpOworfQorCitzdGF0aWMgdm9pZCBzaWduYWxfaGFuZGxlcl9pZ25vcmUoaW50IHNpZykKK3sKKwlzaWduYWwoc2lnLCBzaWduYWxfaGFuZGxlcl9pZ25vcmUpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXNuZF9vdXRwdXRfdCAqb3V0cHV0OworCWludCBpLCBqLCBrLCBsLCBlcnI7CisKKwllcnIgPSBzbmRfb3V0cHV0X3N0ZGlvX2F0dGFjaCgmb3V0cHV0LCBzdGRvdXQsIDApOworCWlmIChlcnIgPCAwKSB7CisJCWxvZ2l0KExPR19DUklULCAiT3V0cHV0IGZhaWxlZDogJXNcbiIsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKwllcnIgPSBwYXJzZV9jb25maWcoYXJnYywgYXJndiwgb3V0cHV0LCAxKTsKKwlpZiAoZXJyIDwgMCkgeworCQlsb2dpdChMT0dfQ1JJVCwgIlVuYWJsZSB0byBwYXJzZSBhcmd1bWVudHMgb3IgY29uZmlndXJhdGlvbi4uLlxuIik7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisJd2hpbGUgKG15X2FyZ2MgPiAwKQorCQlmcmVlKG15X2FyZ3ZbLS1teV9hcmdjXSk7CisJZnJlZShteV9hcmd2KTsKKworCWlmIChsb29wYmFja3NfY291bnQgPD0gMCkgeworCQlsb2dpdChMT0dfQ1JJVCwgIk5vIGxvb3BiYWNrIGRlZmluZWQuLi5cbiIpOworCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCisJaWYgKGRhZW1vbml6ZSkgeworCQlpZiAoZGFlbW9uKDAsIDApIDwgMCkgeworCQkJbG9naXQoTE9HX0NSSVQsICJkYWVtb24oKSBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQkJZXhpdChFWElUX0ZBSUxVUkUpOworCQl9CisJCWkgPSBmb3JrKCk7CisJCWlmIChpIDwgMCkgeworCQkJbG9naXQoTE9HX0NSSVQsICJmb3JrKCkgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwkJfQorCQlpZiAoaSA+IDApIHsKKwkJCS8qIHdhaXQoJmkpOyAqLworCQkJZXhpdChFWElUX1NVQ0NFU1MpOworCQl9CisJfQorCisJLyogd2UgbXVzdCBzb3J0IHRocmVhZCBJRHMgKi8KKwlqID0gLTE7CisJZG8geworCQlrID0gMHg3ZmZmZmZmZjsKKwkJZm9yIChpID0gMDsgaSA8IGxvb3BiYWNrc19jb3VudDsgaSsrKSB7CisJCQlpZiAobG9vcGJhY2tzW2ldLT50aHJlYWQgPCBrICYmCisJCQkgICAgbG9vcGJhY2tzW2ldLT50aHJlYWQgPiBqKQorCQkJCWsgPSBsb29wYmFja3NbaV0tPnRocmVhZDsKKwkJfQorCQlqKys7CisJCWZvciAoaSA9IDA7IGkgPCBsb29wYmFja3NfY291bnQ7IGkrKykgeworCQkJaWYgKGxvb3BiYWNrc1tpXS0+dGhyZWFkID09IGspCisJCQkJbG9vcGJhY2tzW2ldLT50aHJlYWQgPSBqOworCQl9CisJfSB3aGlsZSAoayAhPSAweDdmZmZmZmZmKTsKKwkvKiBmaXggbWF4aW11bSB0aHJlYWQgaWQgKi8KKwlmb3IgKGkgPSAwLCBqID0gLTE7IGkgPCBsb29wYmFja3NfY291bnQ7IGkrKykgeworCQlpZiAobG9vcGJhY2tzW2ldLT50aHJlYWQgPiBqKQorCQkJaiA9IGxvb3BiYWNrc1tpXS0+dGhyZWFkOworCX0KKwlqICs9IDE7CisJdGhyZWFkcyA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGxvb3BiYWNrX3RocmVhZCkgKiBqKTsKKwlpZiAodGhyZWFkcyA9PSBOVUxMKSB7CisJCWxvZ2l0KExPR19DUklULCAiTm8gZW5vdWdoIG1lbW9yeVxuIik7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisJLyogc29ydCBhbGwgdGhyZWFkcyAqLworCWZvciAoayA9IDA7IGsgPCBqOyBrKyspIHsKKwkJZm9yIChpID0gbCA9IDA7IGkgPCBsb29wYmFja3NfY291bnQ7IGkrKykKKwkJCWlmIChsb29wYmFja3NbaV0tPnRocmVhZCA9PSBrKQorCQkJCWwrKzsKKwkJdGhyZWFkc1trXS5sb29wYmFja3MgPSBtYWxsb2MobCAqIHNpemVvZihzdHJ1Y3QgbG9vcGJhY2sgKikpOworCQl0aHJlYWRzW2tdLmxvb3BiYWNrc19jb3VudCA9IGw7CisJCXRocmVhZHNba10ub3V0cHV0ID0gb3V0cHV0OworCQl0aHJlYWRzW2tdLnRocmVhZGVkID0gaiA+IDE7CisJCWZvciAoaSA9IGwgPSAwOyBpIDwgbG9vcGJhY2tzX2NvdW50OyBpKyspCisJCQlpZiAobG9vcGJhY2tzW2ldLT50aHJlYWQgPT0gaykKKwkJCQl0aHJlYWRzW2tdLmxvb3BiYWNrc1tsKytdID0gbG9vcGJhY2tzW2ldOworCX0KKwl0aHJlYWRzX2NvdW50ID0gajsKKwltYWluX2pvYiA9IHB0aHJlYWRfc2VsZigpOworIAorCXNpZ25hbChTSUdJTlQsIHNpZ25hbF9oYW5kbGVyKTsKKwlzaWduYWwoU0lHVEVSTSwgc2lnbmFsX2hhbmRsZXIpOworCXNpZ25hbChTSUdBQlJULCBzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR1VTUjEsIHNpZ25hbF9oYW5kbGVyX3N0YXRlKTsKKwlzaWduYWwoU0lHVVNSMiwgc2lnbmFsX2hhbmRsZXJfaWdub3JlKTsKKworCWZvciAoayA9IDA7IGsgPCB0aHJlYWRzX2NvdW50OyBrKyspCisJCXRocmVhZF9qb2IoJnRocmVhZHNba10pOworCisJaWYgKGogPiAxKSB7CisJCWZvciAoayA9IDA7IGsgPCB0aHJlYWRzX2NvdW50OyBrKyspCisJCQlwdGhyZWFkX2pvaW4odGhyZWFkc1trXS50aHJlYWQsIE5VTEwpOworCX0KKworCWlmICh1c2Vfc3lzbG9nKQorCQljbG9zZWxvZygpOworCWV4aXQoRVhJVF9TVUNDRVNTKTsKK30KZGlmZiAtLWdpdCBhL2Fsc2Fsb29wL2Fsc2Fsb29wLmggYi9hbHNhbG9vcC9hbHNhbG9vcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYzQ0NWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbHNhbG9vcC9hbHNhbG9vcC5oCkBAIC0wLDAgKzEsMjE4IEBACisvKgorICogIEEgc2ltcGxlIFBDTSBsb29wYmFjayB1dGlsaXR5CisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSAiYWNvbmZpZy5oIgorI2lmZGVmIEhBVkVfU0FNUExFUkFURV9ICisjZGVmaW5lIFVTRV9TQU1QTEVSQVRFCisjaW5jbHVkZSA8c2FtcGxlcmF0ZS5oPgorI2Vsc2UKK2VudW0geworCVNSQ19TSU5DX0JFU1RfUVVBTElUWQk9IDAsCisJU1JDX1NJTkNfTUVESVVNX1FVQUxJVFkJPSAxLAorCVNSQ19TSU5DX0ZBU1RFU1QJPSAyLAorCVNSQ19aRVJPX09SREVSX0hPTEQJPSAzLAorCVNSQ19MSU5FQVIJCT0gNAorfTsKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9BUkdTCTEyOAorI2RlZmluZSBNQVhfTUlYRVJTCTY0CisKKyNpZiAwCisjZGVmaW5lIEZJTEVfUFdSSVRFICIvdG1wL2Fsc2Fsb29wLnByYXciCisjZGVmaW5lIEZJTEVfQ1dSSVRFICIvdG1wL2Fsc2Fsb29wLmNyYXciCisjZW5kaWYKKworI2RlZmluZSBXT1JLQVJPVU5EX1NFUklBTE9QRU4JKDE8PDApCisKK3R5cGVkZWYgZW51bSBfc3luY190eXBlIHsKKwlTWU5DX1RZUEVfTk9ORSA9IDAsCisJU1lOQ19UWVBFX1NJTVBMRSwJLyogYWRkIG9yIHJlbW92ZSBzYW1wbGVzICovCisJU1lOQ19UWVBFX0NBUFRSQVRFU0hJRlQsCisJU1lOQ19UWVBFX1BMQVlSQVRFU0hJRlQsCisJU1lOQ19UWVBFX1NBTVBMRVJBVEUsCisJU1lOQ19UWVBFX0FVVE8sCQkvKiBvcmRlcjogQ0FQVFJBVEVTSElGVCwgUExBWVJBVEVTSElGVCwgKi8KKwkJCQkvKiAgICAgICAgU0FNUExFUkFURSwgU0lNUExFICovCisJU1lOQ19UWVBFX0xBU1QgPSBTWU5DX1RZUEVfQVVUTworfSBzeW5jX3R5cGVfdDsKKwordHlwZWRlZiBlbnVtIF9zbGF2ZV90eXBlIHsKKwlTTEFWRV9UWVBFX0FVVE8gPSAwLAorCVNMQVZFX1RZUEVfT04gPSAxLAorCVNMQVZFX1RZUEVfT0ZGID0gMiwKKwlTTEFWRV9UWVBFX0xBU1QgPSBTTEFWRV9UWVBFX09GRgorfSBzbGF2ZV90eXBlX3Q7CisKK3N0cnVjdCBsb29wYmFja19jb250cm9sIHsKKwlzbmRfY3RsX2VsZW1faWRfdCAqaWQ7CisJc25kX2N0bF9lbGVtX2luZm9fdCAqaW5mbzsKKwlzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdmFsdWU7Cit9OworCitzdHJ1Y3QgbG9vcGJhY2tfbWl4ZXIgeworCXVuc2lnbmVkIGludCBza2lwOjE7CisJc3RydWN0IGxvb3BiYWNrX2NvbnRyb2wgc3JjOworCXN0cnVjdCBsb29wYmFja19jb250cm9sIGRzdDsKKwlzdHJ1Y3QgbG9vcGJhY2tfbWl4ZXIgKm5leHQ7Cit9OworCitzdHJ1Y3QgbG9vcGJhY2tfb3NzbWl4ZXIgeworCXVuc2lnbmVkIGludCBza2lwOjE7CisJY29uc3QgY2hhciAqYWxzYV9pZDsKKwlpbnQgYWxzYV9pbmRleDsKKwljb25zdCBjaGFyICpvc3NfaWQ7CisJc3RydWN0IGxvb3BiYWNrX29zc21peGVyICpuZXh0OworfTsKKworc3RydWN0IGxvb3BiYWNrX2hhbmRsZSB7CisJc3RydWN0IGxvb3BiYWNrICpsb29wYmFjazsKKwljaGFyICpkZXZpY2U7CisJY2hhciAqY3RsZGV2OworCWNoYXIgKmlkOworCWludCBjYXJkX251bWJlcjsKKwlzbmRfcGNtX3QgKmhhbmRsZTsKKwlzbmRfcGNtX2FjY2Vzc190IGFjY2VzczsKKwlzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdDsKKwl1bnNpZ25lZCBpbnQgcmF0ZTsKKwl1bnNpZ25lZCBpbnQgcmF0ZV9yZXE7CisJdW5zaWduZWQgaW50IGNoYW5uZWxzOworCXVuc2lnbmVkIGludCBidWZmZXJfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgcGVyaW9kX3NpemU7CisJc25kX3BjbV91ZnJhbWVzX3QgYXZhaWxfbWluOworCXVuc2lnbmVkIGludCBidWZmZXJfc2l6ZV9yZXE7CisJdW5zaWduZWQgaW50IHBlcmlvZF9zaXplX3JlcTsKKwl1bnNpZ25lZCBpbnQgZnJhbWVfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgcmVzYW1wbGU6MTsJLyogZG8gcmVzYW1wbGUgKi8KKwl1bnNpZ25lZCBpbnQgbmJsb2NrOjE7CQkvKiBkbyBibG9jayAocGVyaW9kIHNpemUpIHRyYW5zZmVycyAqLworCXVuc2lnbmVkIGludCB4cnVuX3BlbmRpbmc6MTsKKwl1bnNpZ25lZCBpbnQgcG9sbGZkX2NvdW50OworCS8qIEkvTyBqb2IgKi8KKwljaGFyICpidWY7CQkJLyogSS9PIGJ1ZmZlciAqLworCXNuZF9wY21fdWZyYW1lc190IGJ1Zl9wb3M7CS8qIEkvTyBwb3NpdGlvbiAqLworCXNuZF9wY21fdWZyYW1lc190IGJ1Zl9jb3VudDsJLyogZmlsbGVkIHNhbXBsZXMgKi8KKwlzbmRfcGNtX3VmcmFtZXNfdCBidWZfc2l6ZTsJLyogYnVmZmVyIHNpemUgaW4gZnJhbWVzICovCisJc25kX3BjbV91ZnJhbWVzX3QgYnVmX292ZXI7CS8qIGNhcHR1cmUgYnVmZmVyIG92ZXJmbG93ICovCisJLyogc3RhdGlzdGljcyAqLworCXNuZF9wY21fdWZyYW1lc190IG1heDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgY291bnRlcjsKKwl1bnNpZ25lZCBsb25nIHN5bmNfcG9pbnQ7CS8qIGluIHNhbXBsZXMgKi8KKwlzbmRfcGNtX3NmcmFtZXNfdCBsYXN0X2RlbGF5OworCWRvdWJsZSBwaXRjaDsKKwlzbmRfcGNtX3VmcmFtZXNfdCB0b3RhbF9xdWV1ZWQ7CisJLyogY29udHJvbCAqLworCXNuZF9jdGxfdCAqY3RsOworCXVuc2lnbmVkIGludCBjdGxfcG9sbGZkX2NvdW50OworCXNuZF9jdGxfZWxlbV92YWx1ZV90ICpjdGxfbm90aWZ5OworCXNuZF9jdGxfZWxlbV92YWx1ZV90ICpjdGxfcmF0ZV9zaGlmdDsKKwlzbmRfY3RsX2VsZW1fdmFsdWVfdCAqY3RsX2FjdGl2ZTsKKwlzbmRfY3RsX2VsZW1fdmFsdWVfdCAqY3RsX2Zvcm1hdDsKKwlzbmRfY3RsX2VsZW1fdmFsdWVfdCAqY3RsX3JhdGU7CisJc25kX2N0bF9lbGVtX3ZhbHVlX3QgKmN0bF9jaGFubmVsczsKK307CisKK3N0cnVjdCBsb29wYmFjayB7CisJY2hhciAqaWQ7CisJc3RydWN0IGxvb3BiYWNrX2hhbmRsZSAqY2FwdDsKKwlzdHJ1Y3QgbG9vcGJhY2tfaGFuZGxlICpwbGF5OworCXNuZF9wY21fdWZyYW1lc190IGxhdGVuY3k7CS8qIGZpbmFsIGxhdGVuY3kgaW4gZnJhbWVzICovCisJdW5zaWduZWQgaW50IGxhdGVuY3lfcmVxOwkvKiBpbiBmcmFtZXMgKi8KKwl1bnNpZ25lZCBpbnQgbGF0ZW5jeV9yZXF0aW1lOwkvKiBpbiB1cyAqLworCXVuc2lnbmVkIGxvbmcgbG9vcF90aW1lOwkvKiB+MCA9IHVubGltaXRlZCAoaW4gc2Vjb25kcykgKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcgbG9vcF9saW1pdDsJLyogfjAgPSB1bmxpbWl0ZWQgKGluIGZyYW1lcykgKi8KKwlzbmRfb3V0cHV0X3QgKm91dHB1dDsKKwlzbmRfb3V0cHV0X3QgKnN0YXRlOworCWludCBwb2xsZmRfY291bnQ7CisJaW50IGFjdGl2ZV9wb2xsZmRfY291bnQ7CisJdW5zaWduZWQgaW50IGxpbmtlZDoxOwkJLyogbGlua2VkIHN0cmVhbXMgKi8KKwl1bnNpZ25lZCBpbnQgcmVpbml0OjE7CisJdW5zaWduZWQgaW50IHJ1bm5pbmc6MTsKKwl1bnNpZ25lZCBpbnQgc3RvcF9wZW5kaW5nOjE7CisJc25kX3BjbV91ZnJhbWVzX3Qgc3RvcF9jb3VudDsKKwlzeW5jX3R5cGVfdCBzeW5jOwkJLyogdHlwZSBvZiBzeW5jICovCisJc2xhdmVfdHlwZV90IHNsYXZlOworCWludCB0aHJlYWQ7CQkJLyogdGhyZWFkIG51bWJlciAqLworCXVuc2lnbmVkIGludCB3YWtlOworCS8qIHN0YXRpc3RpY3MgKi8KKwlkb3VibGUgcGl0Y2g7CisJZG91YmxlIHBpdGNoX2RlbHRhOworCXNuZF9wY21fc2ZyYW1lc190IHBpdGNoX2RpZmY7CisJc25kX3BjbV9zZnJhbWVzX3QgcGl0Y2hfZGlmZl9taW47CisJc25kX3BjbV9zZnJhbWVzX3QgcGl0Y2hfZGlmZl9tYXg7CisJdW5zaWduZWQgaW50IHRvdGFsX3F1ZXVlZF9jb3VudDsKKwlzbmRfdGltZXN0YW1wX3QgdHN0YW1wX3N0YXJ0OworCXNuZF90aW1lc3RhbXBfdCB0c3RhbXBfZW5kOworCS8qIHhydW4gcHJvZmlsaW5nICovCisJdW5zaWduZWQgaW50IHhydW46MTsJCS8qIHhydW4gcHJvZmlsaW5nICovCisJc25kX3RpbWVzdGFtcF90IHhydW5fbGFzdF91cGRhdGU7CisJc25kX3RpbWVzdGFtcF90IHhydW5fbGFzdF93YWtlMDsKKwlzbmRfdGltZXN0YW1wX3QgeHJ1bl9sYXN0X3dha2U7CisJc25kX3RpbWVzdGFtcF90IHhydW5fbGFzdF9jaGVjazA7CisJc25kX3RpbWVzdGFtcF90IHhydW5fbGFzdF9jaGVjazsKKwlzbmRfcGNtX3NmcmFtZXNfdCB4cnVuX2xhc3RfcGRlbGF5OworCXNuZF9wY21fc2ZyYW1lc190IHhydW5fbGFzdF9jZGVsYXk7CisJc25kX3BjbV91ZnJhbWVzX3QgeHJ1bl9idWZfcGNvdW50OworCXNuZF9wY21fdWZyYW1lc190IHhydW5fYnVmX2Njb3VudDsKKwl1bnNpZ25lZCBpbnQgeHJ1bl9vdXRfZnJhbWVzOworCWxvbmcgeHJ1bl9tYXhfcHJvY3RpbWU7CisJZG91YmxlIHhydW5fbWF4X21pc3Npbmc7CisJLyogY29udHJvbCBtaXhlciAqLworCXN0cnVjdCBsb29wYmFja19taXhlciAqY29udHJvbHM7CisJc3RydWN0IGxvb3BiYWNrX29zc21peGVyICpvc3NfY29udHJvbHM7CisJLyogc2FtcGxlIHJhdGUgKi8KKwl1bnNpZ25lZCBpbnQgdXNlX3NhbXBsZXJhdGU6MTsKKyNpZmRlZiBVU0VfU0FNUExFUkFURQorCXVuc2lnbmVkIGludCBzcmNfZW5hYmxlOjE7CisJaW50IHNyY19jb252ZXJ0ZXJfdHlwZTsKKwlTUkNfU1RBVEUgKnNyY19zdGF0ZTsKKwlTUkNfREFUQSBzcmNfZGF0YTsKKwl1bnNpZ25lZCBpbnQgc3JjX291dF9mcmFtZXM7CisjZW5kaWYKKyNpZmRlZiBGSUxFX0NXUklURQorCUZJTEUgKmNmaWxlOworI2VuZGlmCisjaWZkZWYgRklMRV9QV1JJVEUKKwlGSUxFICpwZmlsZTsKKyNlbmRpZgorfTsKKworZXh0ZXJuIGludCB2ZXJib3NlOworZXh0ZXJuIGludCB3b3JrYXJvdW5kczsKK2V4dGVybiBpbnQgdXNlX3N5c2xvZzsKKworI2RlZmluZSBsb2dpdChwcmlvcml0eSwgZm10LCBhcmdzLi4uKSBkbyB7CQlcCisJaWYgKHVzZV9zeXNsb2cpCQkJCQlcCisJCXN5c2xvZyhwcmlvcml0eSwgZm10LCAjI2FyZ3MpOwkJXAorCWVsc2UJCQkJCQlcCisJCWZwcmludGYoc3RkZXJyLCBmbXQsICMjYXJncyk7CQlcCit9IHdoaWxlICgwKQorCitpbnQgcGNtam9iX2luaXQoc3RydWN0IGxvb3BiYWNrICpsb29wKTsKK2ludCBwY21qb2JfZG9uZShzdHJ1Y3QgbG9vcGJhY2sgKmxvb3ApOworaW50IHBjbWpvYl9zdGFydChzdHJ1Y3QgbG9vcGJhY2sgKmxvb3ApOworaW50IHBjbWpvYl9zdG9wKHN0cnVjdCBsb29wYmFjayAqbG9vcCk7CitpbnQgcGNtam9iX3BvbGxmZHNfaW5pdChzdHJ1Y3QgbG9vcGJhY2sgKmxvb3AsIHN0cnVjdCBwb2xsZmQgKmZkcyk7CitpbnQgcGNtam9iX3BvbGxmZHNfaGFuZGxlKHN0cnVjdCBsb29wYmFjayAqbG9vcCwgc3RydWN0IHBvbGxmZCAqZmRzKTsKK3ZvaWQgcGNtam9iX3N0YXRlKHN0cnVjdCBsb29wYmFjayAqbG9vcCk7CisKK2ludCBjb250cm9sX3BhcnNlX2lkKGNvbnN0IGNoYXIgKnN0ciwgc25kX2N0bF9lbGVtX2lkX3QgKmlkKTsKK2ludCBjb250cm9sX2lkX21hdGNoKHNuZF9jdGxfZWxlbV9pZF90ICppZDEsIHNuZF9jdGxfZWxlbV9pZF90ICppZDIpOworaW50IGNvbnRyb2xfaW5pdChzdHJ1Y3QgbG9vcGJhY2sgKmxvb3ApOworaW50IGNvbnRyb2xfZG9uZShzdHJ1Y3QgbG9vcGJhY2sgKmxvb3ApOworaW50IGNvbnRyb2xfZXZlbnQoc3RydWN0IGxvb3BiYWNrX2hhbmRsZSAqbGhhbmRsZSwgc25kX2N0bF9ldmVudF90ICpldik7CmRpZmYgLS1naXQgYS9hbHNhbG9vcC9jb250cm9sLmMgYi9hbHNhbG9vcC9jb250cm9sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM4M2Q3OQotLS0gL2Rldi9udWxsCisrKyBiL2Fsc2Fsb29wL2NvbnRyb2wuYwpAQCAtMCwwICsxLDQyNCBAQAorLyoKKyAqICBBIHNpbXBsZSBQQ00gbG9vcGJhY2sgdXRpbGl0eQorICogIENvcHlyaWdodCAoYykgMjAxMCBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICoKKyAqICAgICBBdXRob3I6IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8YWxzYS9hc291bmRsaWIuaD4KKyNpbmNsdWRlICJhbHNhbG9vcC5oIgorCitzdGF0aWMgY2hhciAqaWRfc3RyKHNuZF9jdGxfZWxlbV9pZF90ICppZCkKK3sKKwlzdGF0aWMgY2hhciBzdHJbMTI4XTsKKworCXNwcmludGYoc3RyLCAiJWksJXMsJWksJWksJXMsJWkiLAorCQlzbmRfY3RsX2VsZW1faWRfZ2V0X251bWlkKGlkKSwKKwkJc25kX2N0bF9lbGVtX2lmYWNlX25hbWUoc25kX2N0bF9lbGVtX2lkX2dldF9pbnRlcmZhY2UoaWQpKSwKKwkJc25kX2N0bF9lbGVtX2lkX2dldF9kZXZpY2UoaWQpLAorCQlzbmRfY3RsX2VsZW1faWRfZ2V0X3N1YmRldmljZShpZCksCisJCXNuZF9jdGxfZWxlbV9pZF9nZXRfbmFtZShpZCksCisJCXNuZF9jdGxfZWxlbV9pZF9nZXRfaW5kZXgoaWQpKTsKKwlyZXR1cm4gc3RyOworfQorCitpbnQgY29udHJvbF9wYXJzZV9pZChjb25zdCBjaGFyICpzdHIsIHNuZF9jdGxfZWxlbV9pZF90ICppZCkKK3sKKwlpbnQgYywgc2l6ZSwgbnVtaWQ7CisJY2hhciAqcHRyOworCisJd2hpbGUgKCpzdHIgPT0gJyAnIHx8ICpzdHIgPT0gJ1x0JykKKwkJc3RyKys7CisJaWYgKCEoKnN0cikpCisJCXJldHVybiAtRUlOVkFMOworCXNuZF9jdGxfZWxlbV9pZF9zZXRfaW50ZXJmYWNlKGlkLCBTTkRfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIpOwkvKiBkZWZhdWx0ICovCisJd2hpbGUgKCpzdHIpIHsKKwkJaWYgKCFzdHJuY2FzZWNtcChzdHIsICJudW1pZD0iLCA2KSkgeworCQkJc3RyICs9IDY7CisJCQludW1pZCA9IGF0b2koc3RyKTsKKwkJCWlmIChudW1pZCA8PSAwKSB7CisJCQkJbG9naXQoTE9HX0NSSVQsICJJbnZhbGlkIG51bWlkICVkXG4iLCBudW1pZCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlzbmRfY3RsX2VsZW1faWRfc2V0X251bWlkKGlkLCBhdG9pKHN0cikpOworCQkJd2hpbGUgKGlzZGlnaXQoKnN0cikpCisJCQkJc3RyKys7CisJCX0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKHN0ciwgImlmYWNlPSIsIDYpKSB7CisJCQlzdHIgKz0gNjsKKwkJCWlmICghc3RybmNhc2VjbXAoc3RyLCAiY2FyZCIsIDQpKSB7CisJCQkJc25kX2N0bF9lbGVtX2lkX3NldF9pbnRlcmZhY2UoaWQsIFNORF9DVExfRUxFTV9JRkFDRV9DQVJEKTsKKwkJCQlzdHIgKz0gNDsKKwkJCX0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKHN0ciwgIm1peGVyIiwgNSkpIHsKKwkJCQlzbmRfY3RsX2VsZW1faWRfc2V0X2ludGVyZmFjZShpZCwgU05EX0NUTF9FTEVNX0lGQUNFX01JWEVSKTsKKwkJCQlzdHIgKz0gNTsKKwkJCX0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKHN0ciwgInBjbSIsIDMpKSB7CisJCQkJc25kX2N0bF9lbGVtX2lkX3NldF9pbnRlcmZhY2UoaWQsIFNORF9DVExfRUxFTV9JRkFDRV9QQ00pOworCQkJCXN0ciArPSAzOworCQkJfSBlbHNlIGlmICghc3RybmNhc2VjbXAoc3RyLCAicmF3bWlkaSIsIDcpKSB7CisJCQkJc25kX2N0bF9lbGVtX2lkX3NldF9pbnRlcmZhY2UoaWQsIFNORF9DVExfRUxFTV9JRkFDRV9SQVdNSURJKTsKKwkJCQlzdHIgKz0gNzsKKwkJCX0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKHN0ciwgInRpbWVyIiwgNSkpIHsKKwkJCQlzbmRfY3RsX2VsZW1faWRfc2V0X2ludGVyZmFjZShpZCwgU05EX0NUTF9FTEVNX0lGQUNFX1RJTUVSKTsKKwkJCQlzdHIgKz0gNTsKKwkJCX0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKHN0ciwgInNlcXVlbmNlciIsIDkpKSB7CisJCQkJc25kX2N0bF9lbGVtX2lkX3NldF9pbnRlcmZhY2UoaWQsIFNORF9DVExfRUxFTV9JRkFDRV9TRVFVRU5DRVIpOworCQkJCXN0ciArPSA5OworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfSBlbHNlIGlmICghc3RybmNhc2VjbXAoc3RyLCAibmFtZT0iLCA1KSkgeworCQkJY2hhciBidWZbNjRdOworCQkJc3RyICs9IDU7CisJCQlwdHIgPSBidWY7CisJCQlzaXplID0gMDsKKwkJCWlmICgqc3RyID09ICdcJycgfHwgKnN0ciA9PSAnXCInKSB7CisJCQkJYyA9ICpzdHIrKzsKKwkJCQl3aGlsZSAoKnN0ciAmJiAqc3RyICE9IGMpIHsKKwkJCQkJaWYgKHNpemUgPCAoaW50KXNpemVvZihidWYpKSB7CisJCQkJCQkqcHRyKysgPSAqc3RyOworCQkJCQkJc2l6ZSsrOworCQkJCQl9CisJCQkJCXN0cisrOworCQkJCX0KKwkJCQlpZiAoKnN0ciA9PSBjKQorCQkJCQlzdHIrKzsKKwkJCX0gZWxzZSB7CisJCQkJd2hpbGUgKCpzdHIgJiYgKnN0ciAhPSAnLCcpIHsKKwkJCQkJaWYgKHNpemUgPCAoaW50KXNpemVvZihidWYpKSB7CisJCQkJCQkqcHRyKysgPSAqc3RyOworCQkJCQkJc2l6ZSsrOworCQkJCQl9CisJCQkJCXN0cisrOworCQkJCX0KKwkJCX0KKwkJCSpwdHIgPSAnXDAnOworCQkJc25kX2N0bF9lbGVtX2lkX3NldF9uYW1lKGlkLCBidWYpOworCQl9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChzdHIsICJpbmRleD0iLCA2KSkgeworCQkJc3RyICs9IDY7CisJCQlzbmRfY3RsX2VsZW1faWRfc2V0X2luZGV4KGlkLCBhdG9pKHN0cikpOworCQkJd2hpbGUgKGlzZGlnaXQoKnN0cikpCisJCQkJc3RyKys7CisJCX0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKHN0ciwgImRldmljZT0iLCA3KSkgeworCQkJc3RyICs9IDc7CisJCQlzbmRfY3RsX2VsZW1faWRfc2V0X2RldmljZShpZCwgYXRvaShzdHIpKTsKKwkJCXdoaWxlIChpc2RpZ2l0KCpzdHIpKQorCQkJCXN0cisrOworCQl9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChzdHIsICJzdWJkZXZpY2U9IiwgMTApKSB7CisJCQlzdHIgKz0gMTA7CisJCQlzbmRfY3RsX2VsZW1faWRfc2V0X3N1YmRldmljZShpZCwgYXRvaShzdHIpKTsKKwkJCXdoaWxlIChpc2RpZ2l0KCpzdHIpKQorCQkJCXN0cisrOworCQl9CisJCWlmICgqc3RyID09ICcsJykgeworCQkJc3RyKys7CisJCX0gZWxzZSB7CisJCQlpZiAoKnN0cikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGNvbnRyb2xfaWRfbWF0Y2goc25kX2N0bF9lbGVtX2lkX3QgKmlkMSwgc25kX2N0bF9lbGVtX2lkX3QgKmlkMikKK3sKKwlpZiAoc25kX2N0bF9lbGVtX2lkX2dldF9pbnRlcmZhY2UoaWQxKSAhPQorCSAgICBzbmRfY3RsX2VsZW1faWRfZ2V0X2ludGVyZmFjZShpZDIpKQorCQlyZXR1cm4gMDsKKwlpZiAoc25kX2N0bF9lbGVtX2lkX2dldF9kZXZpY2UoaWQxKSAhPQorCSAgICBzbmRfY3RsX2VsZW1faWRfZ2V0X2RldmljZShpZDIpKQorCQlyZXR1cm4gMDsKKwlpZiAoc25kX2N0bF9lbGVtX2lkX2dldF9zdWJkZXZpY2UoaWQxKSAhPQorCSAgICBzbmRfY3RsX2VsZW1faWRfZ2V0X3N1YmRldmljZShpZDIpKQorCQlyZXR1cm4gMDsKKwlpZiAoc3RyY21wKHNuZF9jdGxfZWxlbV9pZF9nZXRfbmFtZShpZDEpLAorCQkgICBzbmRfY3RsX2VsZW1faWRfZ2V0X25hbWUoaWQyKSkgIT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKHNuZF9jdGxfZWxlbV9pZF9nZXRfaW5kZXgoaWQxKSAhPQorCSAgICBzbmRfY3RsX2VsZW1faWRfZ2V0X2luZGV4KGlkMikpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNvbnRyb2xfaW5pdDEoc3RydWN0IGxvb3BiYWNrX2hhbmRsZSAqbGhhbmRsZSwKKwkJCSBzdHJ1Y3QgbG9vcGJhY2tfY29udHJvbCAqY3RsKQoreworCWludCBlcnI7CisKKwlzbmRfY3RsX2VsZW1faW5mb19zZXRfaWQoY3RsLT5pbmZvLCBjdGwtPmlkKTsKKwlzbmRfY3RsX2VsZW1fdmFsdWVfc2V0X2lkKGN0bC0+dmFsdWUsIGN0bC0+aWQpOworCWlmIChsaGFuZGxlLT5jdGwgPT0gTlVMTCkgeworCQlsb2dpdChMT0dfV0FSTklORywgIlVuYWJsZSB0byByZWFkIGNvbnRyb2wgaW5mbyBmb3IgJyVzJ1xuIiwgaWRfc3RyKGN0bC0+aWQpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWVyciA9IHNuZF9jdGxfZWxlbV9pbmZvKGxoYW5kbGUtPmN0bCwgY3RsLT5pbmZvKTsKKwlpZiAoZXJyIDwgMCkgeworCQlsb2dpdChMT0dfV0FSTklORywgIlVuYWJsZSB0byByZWFkIGNvbnRyb2wgaW5mbyAnJXMnOiAlc1xuIiwgaWRfc3RyKGN0bC0+aWQpLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybiBlcnI7CisJfQorCWVyciA9IHNuZF9jdGxfZWxlbV9yZWFkKGxoYW5kbGUtPmN0bCwgY3RsLT52YWx1ZSk7CisJaWYgKGVyciA8IDApIHsKKwkJbG9naXQoTE9HX1dBUk5JTkcsICJVbmFibGUgdG8gcmVhZCBjb250cm9sIHZhbHVlIChpbml0MSkgJyVzJzogJXNcbiIsIGlkX3N0cihjdGwtPmlkKSwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb3B5X3ZhbHVlKHN0cnVjdCBsb29wYmFja19jb250cm9sICpkc3QsCisJCSAgICAgIHN0cnVjdCBsb29wYmFja19jb250cm9sICpzcmMpCit7CisJc25kX2N0bF9lbGVtX3R5cGVfdCB0eXBlOworCXVuc2lnbmVkIGludCBjb3VudDsKKwlpbnQgaTsKKworCXR5cGUgPSBzbmRfY3RsX2VsZW1faW5mb19nZXRfdHlwZShkc3QtPmluZm8pOworCWNvdW50ID0gc25kX2N0bF9lbGVtX2luZm9fZ2V0X2NvdW50KGRzdC0+aW5mbyk7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTTkRfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOgorCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJCXNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfYm9vbGVhbihkc3QtPnZhbHVlLAorCQkJCWksIHNuZF9jdGxfZWxlbV92YWx1ZV9nZXRfYm9vbGVhbihzcmMtPnZhbHVlLCBpKSk7CisJCWJyZWFrOworCWNhc2UgU05EX0NUTF9FTEVNX1RZUEVfSU5URUdFUjoKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCXNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfaW50ZWdlcihkc3QtPnZhbHVlLAorCQkJCWksIHNuZF9jdGxfZWxlbV92YWx1ZV9nZXRfaW50ZWdlcihzcmMtPnZhbHVlLCBpKSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbG9naXQoTE9HX0NSSVQsICJVbmFibGUgdG8gY29weSBjb250cm9sIHZhbHVlIGZvciB0eXBlICVzXG4iLCBzbmRfY3RsX2VsZW1fdHlwZV9uYW1lKHR5cGUpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9zc19zZXQoc3RydWN0IGxvb3BiYWNrICpsb29wLAorCQkgICBzdHJ1Y3QgbG9vcGJhY2tfb3NzbWl4ZXIgKm9zc21peCwKKwkJICAgaW50IGVuYWJsZSkKK3sKKwljaGFyIGJ1ZlsxMjhdLCBmaWxlWzEyOF07CisJaW50IGZkOworCisJaWYgKGxvb3AtPmNhcHQtPmNhcmRfbnVtYmVyIDwgMCkKKwkJcmV0dXJuIDA7CisJaWYgKCFlbmFibGUpIHsKKwkJc3ByaW50ZihidWYsICIlcyBcIlwiIDBcbiIsIG9zc21peC0+b3NzX2lkKTsKKwl9IGVsc2UgeworCQlzcHJpbnRmKGJ1ZiwgIiVzIFwiJXNcIiAlaVxuIiwgb3NzbWl4LT5vc3NfaWQsIG9zc21peC0+YWxzYV9pZCwgb3NzbWl4LT5hbHNhX2luZGV4KTsKKwl9CisJc3ByaW50ZihmaWxlLCAiL3Byb2MvYXNvdW5kL2NhcmQlaS9vc3NfbWl4ZXIiLCBsb29wLT5jYXB0LT5jYXJkX251bWJlcik7CisJaWYgKHZlcmJvc2UpCisJCXNuZF9vdXRwdXRfcHJpbnRmKGxvb3AtPm91dHB1dCwgIiVzOiBJbml0aWFsaXplIE9TUyB2b2x1bWUgJXM6ICVzIiwgbG9vcC0+aWQsIGZpbGUsIGJ1Zik7CisJZmQgPSBvcGVuKGZpbGUsIE9fV1JPTkxZKTsKKwlpZiAoZmQgPj0gMCAmJiB3cml0ZShmZCwgYnVmLCBzdHJsZW4oYnVmKSkgPT0gc3RybGVuKGJ1ZikpIHsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGZkID49IDApCisJCWNsb3NlKGZkKTsKKwlsb2dpdChMT0dfSU5GTywgIiVzOiBVbmFibGUgdG8gaW5pdGlhbGl6ZSBPU1MgTWl4ZXIgSUQgJyVzJ1xuIiwgbG9vcC0+aWQsIG9zc21peC0+b3NzX2lkKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgY29udHJvbF9pbml0MihzdHJ1Y3QgbG9vcGJhY2sgKmxvb3AsCisJCQkgc3RydWN0IGxvb3BiYWNrX21peGVyICptaXgpCit7CisJc25kX2N0bF9lbGVtX3R5cGVfdCB0eXBlOworCXVuc2lnbmVkIGludCBjb3VudDsKKwlpbnQgZXJyOworCisJc25kX2N0bF9lbGVtX2luZm9fY29weShtaXgtPmRzdC5pbmZvLCBtaXgtPnNyYy5pbmZvKTsKKwlzbmRfY3RsX2VsZW1faW5mb19zZXRfaWQobWl4LT5kc3QuaW5mbywgbWl4LT5kc3QuaWQpOworCXNuZF9jdGxfZWxlbV92YWx1ZV9jbGVhcihtaXgtPmRzdC52YWx1ZSk7CisJc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9pZChtaXgtPmRzdC52YWx1ZSwgbWl4LT5kc3QuaWQpOworCXR5cGUgPSBzbmRfY3RsX2VsZW1faW5mb19nZXRfdHlwZShtaXgtPmRzdC5pbmZvKTsKKwljb3VudCA9IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9jb3VudChtaXgtPmRzdC5pbmZvKTsKKwlzbmRfY3RsX2VsZW1fcmVtb3ZlKGxvb3AtPmNhcHQtPmN0bCwgbWl4LT5kc3QuaWQpOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU05EX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjoKKwkJZXJyID0gc25kX2N0bF9lbGVtX2FkZF9ib29sZWFuKGxvb3AtPmNhcHQtPmN0bCwKKwkJCQkJICAgICAgIG1peC0+ZHN0LmlkLCBjb3VudCk7CisJCWNvcHlfdmFsdWUoJm1peC0+ZHN0LCAmbWl4LT5zcmMpOworCQlicmVhazsKKwljYXNlIFNORF9DVExfRUxFTV9UWVBFX0lOVEVHRVI6CisJCWVyciA9IHNuZF9jdGxfZWxlbV9hZGRfaW50ZWdlcihsb29wLT5jYXB0LT5jdGwsCisJCQkJbWl4LT5kc3QuaWQsIGNvdW50LAorCQkJCXNuZF9jdGxfZWxlbV9pbmZvX2dldF9taW4obWl4LT5kc3QuaW5mbyksCisJCQkJc25kX2N0bF9lbGVtX2luZm9fZ2V0X21heChtaXgtPmRzdC5pbmZvKSwKKwkJCQlzbmRfY3RsX2VsZW1faW5mb19nZXRfc3RlcChtaXgtPmRzdC5pbmZvKSk7CisJCWNvcHlfdmFsdWUoJm1peC0+ZHN0LCAmbWl4LT5zcmMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlsb2dpdChMT0dfQ1JJVCwgIlVuYWJsZSB0byBoYW5kbGUgY29udHJvbCB0eXBlICVzXG4iLCBzbmRfY3RsX2VsZW1fdHlwZV9uYW1lKHR5cGUpKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCWlmIChlcnIgPCAwKSB7CisJCWxvZ2l0KExPR19DUklULCAiVW5hYmxlIHRvIGNyZWF0ZSBjb250cm9sICclcyc6ICVzXG4iLCBpZF9zdHIobWl4LT5kc3QuaWQpLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybiBlcnI7CisJfQorCWVyciA9IHNuZF9jdGxfZWxlbV91bmxvY2sobG9vcC0+Y2FwdC0+Y3RsLCBtaXgtPmRzdC5pZCk7CisJaWYgKGVyciA8IDApIHsKKwkJbG9naXQoTE9HX0NSSVQsICJVbmFibGUgdG8gdW5sb2NrIGNvbnRyb2wgaW5mbyAnJXMnOiAlc1xuIiwgaWRfc3RyKG1peC0+ZHN0LmlkKSwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gZXJyOworCX0KKwllcnIgPSBzbmRfY3RsX2VsZW1faW5mbyhsb29wLT5jYXB0LT5jdGwsIG1peC0+ZHN0LmluZm8pOworCWlmIChlcnIgPCAwKSB7CisJCWxvZ2l0KExPR19DUklULCAiVW5hYmxlIHRvIHJlYWQgY29udHJvbCBpbmZvICclcyc6ICVzXG4iLCBpZF9zdHIobWl4LT5kc3QuaWQpLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybiBlcnI7CisJfQorCWlmIChzbmRfY3RsX2VsZW1faW5mb19pc190bHZfd3JpdGFibGUobWl4LT5kc3QuaW5mbykpIHsKKwkJdW5zaWduZWQgaW50IHRsdls2NF07CisJCWVyciA9IHNuZF9jdGxfZWxlbV90bHZfcmVhZChsb29wLT5wbGF5LT5jdGwsCisJCQkJCSAgICBtaXgtPnNyYy5pZCwKKwkJCQkJICAgIHRsdiwgc2l6ZW9mKHRsdikpOworCQlpZiAoZXJyIDwgMCkgeworCQkJbG9naXQoTE9HX0NSSVQsICJVbmFibGUgdG8gcmVhZCBUTFYgZm9yICclcyc6ICVzXG4iLCBpZF9zdHIobWl4LT5zcmMuaWQpLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQl0bHZbMF0gPSB0bHZbMV0gPSAwOworCQl9CisJCWVyciA9IHNuZF9jdGxfZWxlbV90bHZfd3JpdGUobG9vcC0+Y2FwdC0+Y3RsLAorCQkJCQkgICAgIG1peC0+ZHN0LmlkLAorCQkJCQkgICAgIHRsdik7CisJCWlmIChlcnIgPCAwKSB7CisJCQlsb2dpdChMT0dfQ1JJVCwgIlVuYWJsZSB0byB3cml0ZSBUTFYgZm9yICclcyc6ICVzXG4iLCBpZF9zdHIobWl4LT5zcmMuaWQpLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCWVyciA9IHNuZF9jdGxfZWxlbV93cml0ZShsb29wLT5jYXB0LT5jdGwsIG1peC0+ZHN0LnZhbHVlKTsKKwlpZiAoZXJyIDwgMCkgeworCQlsb2dpdChMT0dfQ1JJVCwgIlVuYWJsZSB0byB3cml0ZSBjb250cm9sIHZhbHVlICclcyc6ICVzXG4iLCBpZF9zdHIobWl4LT5kc3QuaWQpLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCitpbnQgY29udHJvbF9pbml0KHN0cnVjdCBsb29wYmFjayAqbG9vcCkKK3sKKwlzdHJ1Y3QgbG9vcGJhY2tfbWl4ZXIgKm1peDsKKwlzdHJ1Y3QgbG9vcGJhY2tfb3NzbWl4ZXIgKm9zc21peDsKKwlpbnQgZXJyOworCisJZm9yIChvc3NtaXggPSBsb29wLT5vc3NfY29udHJvbHM7IG9zc21peDsgb3NzbWl4ID0gb3NzbWl4LT5uZXh0KQorCQlvc3Nfc2V0KGxvb3AsIG9zc21peCwgMCk7CisJZm9yIChtaXggPSBsb29wLT5jb250cm9sczsgbWl4OyBtaXggPSBtaXgtPm5leHQpIHsKKwkJZXJyID0gY29udHJvbF9pbml0MShsb29wLT5wbGF5LCAmbWl4LT5zcmMpOworCQlpZiAoZXJyIDwgMCkgeworCQkJbG9naXQoTE9HX1dBUk5JTkcsICIlczogRGlzYWJsaW5nIHBsYXliYWNrIGNvbnRyb2wgJyVzJ1xuIiwgbG9vcC0+aWQsIGlkX3N0cihtaXgtPnNyYy5pZCkpOworCQkJbWl4LT5za2lwID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWVyciA9IGNvbnRyb2xfaW5pdDIobG9vcCwgbWl4KTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlmb3IgKG9zc21peCA9IGxvb3AtPm9zc19jb250cm9sczsgb3NzbWl4OyBvc3NtaXggPSBvc3NtaXgtPm5leHQpIHsKKwkJZXJyID0gb3NzX3NldChsb29wLCBvc3NtaXgsIDEpOworCQlpZiAoZXJyIDwgMCkgeworCQkJb3NzbWl4LT5za2lwID0gMTsKKwkJCWxvZ2l0KExPR19XQVJOSU5HLCAiJXM6IERpc2FibGluZyBPU1MgbWl4ZXIgSUQgJyVzJ1xuIiwgbG9vcC0+aWQsIG9zc21peC0+b3NzX2lkKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGNvbnRyb2xfZG9uZShzdHJ1Y3QgbG9vcGJhY2sgKmxvb3ApCit7CisJc3RydWN0IGxvb3BiYWNrX21peGVyICptaXg7CisJc3RydWN0IGxvb3BiYWNrX29zc21peGVyICpvc3NtaXg7CisJaW50IGVycjsKKworCWlmIChsb29wLT5jYXB0LT5jdGwgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJZm9yIChvc3NtaXggPSBsb29wLT5vc3NfY29udHJvbHM7IG9zc21peDsgb3NzbWl4ID0gb3NzbWl4LT5uZXh0KSB7CisJCWVyciA9IG9zc19zZXQobG9vcCwgb3NzbWl4LCAwKTsKKwkJaWYgKGVyciA8IDApCisJCQlsb2dpdChMT0dfV0FSTklORywgIiVzOiBVbmFibGUgdG8gcmVtb3ZlIE9TUyBjb250cm9sICclcydcbiIsIGxvb3AtPmlkLCBvc3NtaXgtPm9zc19pZCk7CisJfQorCWZvciAobWl4ID0gbG9vcC0+Y29udHJvbHM7IG1peDsgbWl4ID0gbWl4LT5uZXh0KSB7CisJCWlmIChtaXgtPnNraXApCisJCQljb250aW51ZTsKKwkJZXJyID0gc25kX2N0bF9lbGVtX3JlbW92ZShsb29wLT5jYXB0LT5jdGwsIG1peC0+ZHN0LmlkKTsKKwkJaWYgKGVyciA8IDApCisJCQlsb2dpdChMT0dfV0FSTklORywgIiVzOiBVbmFibGUgdG8gcmVtb3ZlIGNvbnRyb2wgJyVzJzogJXNcbiIsIGxvb3AtPmlkLCBpZF9zdHIobWl4LT5kc3QuaWQpLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbnRyb2xfZXZlbnQxKHN0cnVjdCBsb29wYmFjayAqbG9vcCwKKwkJCSAgc3RydWN0IGxvb3BiYWNrX21peGVyICptaXgsCisJCQkgIHNuZF9jdGxfZXZlbnRfdCAqZXYsCisJCQkgIGludCBjYXB0dXJlKQoreworCXVuc2lnbmVkIGludCBtYXNrID0gc25kX2N0bF9ldmVudF9lbGVtX2dldF9tYXNrKGV2KTsKKwlpbnQgZXJyOworCisJaWYgKG1hc2sgPT0gU05EX0NUTF9FVkVOVF9NQVNLX1JFTU9WRSkKKwkJcmV0dXJuIDA7CisJaWYgKChtYXNrICYgU05EX0NUTF9FVkVOVF9NQVNLX1ZBTFVFKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoIWNhcHR1cmUpIHsKKwkJc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9pZChtaXgtPnNyYy52YWx1ZSwgbWl4LT5zcmMuaWQpOworCQllcnIgPSBzbmRfY3RsX2VsZW1fcmVhZChsb29wLT5wbGF5LT5jdGwsIG1peC0+c3JjLnZhbHVlKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWxvZ2l0KExPR19DUklULCAiVW5hYmxlIHRvIHJlYWQgY29udHJvbCB2YWx1ZSAoZXZlbnQxKSAnJXMnOiAlc1xuIiwgaWRfc3RyKG1peC0+c3JjLmlkKSwgc25kX3N0cmVycm9yKGVycikpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQljb3B5X3ZhbHVlKCZtaXgtPmRzdCwgJm1peC0+c3JjKTsKKwkJZXJyID0gc25kX2N0bF9lbGVtX3dyaXRlKGxvb3AtPmNhcHQtPmN0bCwgbWl4LT5kc3QudmFsdWUpOworCQlpZiAoZXJyIDwgMCkgeworCQkJbG9naXQoTE9HX0NSSVQsICJVbmFibGUgdG8gd3JpdGUgY29udHJvbCB2YWx1ZSAoZXZlbnQxKSAnJXMnOiAlc1xuIiwgaWRfc3RyKG1peC0+ZHN0LmlkKSwgc25kX3N0cmVycm9yKGVycikpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0gZWxzZSB7CisJCWVyciA9IHNuZF9jdGxfZWxlbV9yZWFkKGxvb3AtPmNhcHQtPmN0bCwgbWl4LT5kc3QudmFsdWUpOworCQlpZiAoZXJyIDwgMCkgeworCQkJbG9naXQoTE9HX0NSSVQsICJVbmFibGUgdG8gcmVhZCBjb250cm9sIHZhbHVlIChldmVudDIpICclcyc6ICVzXG4iLCBpZF9zdHIobWl4LT5kc3QuaWQpLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWNvcHlfdmFsdWUoJm1peC0+c3JjLCAmbWl4LT5kc3QpOworCQllcnIgPSBzbmRfY3RsX2VsZW1fd3JpdGUobG9vcC0+cGxheS0+Y3RsLCBtaXgtPnNyYy52YWx1ZSk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlsb2dpdChMT0dfQ1JJVCwgIlVuYWJsZSB0byB3cml0ZSBjb250cm9sIHZhbHVlIChldmVudDIpICclcyc6ICVzXG4iLCBpZF9zdHIobWl4LT5zcmMuaWQpLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCXJldHVybiAwOworfQorCitpbnQgY29udHJvbF9ldmVudChzdHJ1Y3QgbG9vcGJhY2tfaGFuZGxlICpsaGFuZGxlLCBzbmRfY3RsX2V2ZW50X3QgKmV2KQoreworCXNuZF9jdGxfZWxlbV9pZF90ICppZDI7CisJc3RydWN0IGxvb3BiYWNrX21peGVyICptaXg7CisJaW50IGNhcHQgPSBsaGFuZGxlID09IGxoYW5kbGUtPmxvb3BiYWNrLT5jYXB0OworCWludCBlcnI7CisKKwlzbmRfY3RsX2VsZW1faWRfYWxsb2NhKCZpZDIpOworCXNuZF9jdGxfZXZlbnRfZWxlbV9nZXRfaWQoZXYsIGlkMik7CisJZm9yIChtaXggPSBsaGFuZGxlLT5sb29wYmFjay0+Y29udHJvbHM7IG1peDsgbWl4ID0gbWl4LT5uZXh0KSB7CisJCWlmIChtaXgtPnNraXApCisJCQljb250aW51ZTsKKwkJaWYgKGNvbnRyb2xfaWRfbWF0Y2goaWQyLCBjYXB0ID8gbWl4LT5kc3QuaWQgOiBtaXgtPnNyYy5pZCkpIHsKKwkJCWVyciA9IGNvbnRyb2xfZXZlbnQxKGxoYW5kbGUtPmxvb3BiYWNrLCBtaXgsIGV2LCBjYXB0KTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hbHNhbG9vcC9lZmZlY3Qtc3dlZXAuYyBiL2Fsc2Fsb29wL2VmZmVjdC1zd2VlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMDkwM2QKLS0tIC9kZXYvbnVsbAorKysgYi9hbHNhbG9vcC9lZmZlY3Qtc3dlZXAuYwpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqICBCYW5kcGFzcyBmaWx0ZXIgc3dlZXAgZWZmZWN0CisgKiAgQ29weXJpZ2h0IChjKSBNYWFydGVuIGRlIEJvZXIgPG1kZWJvZXJAaXVhLnVwZi5lcz4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8YWxzYS9hc291bmRsaWIuaD4KKworc3RydWN0IGVmZmVjdF9wcml2YXRlIHsKKwkvKiBmaWx0ZXIgdGhlIHN3ZWVwIHZhcmlhYmxlcyAqLworCWZsb2F0IGxmbyxkbGZvLGZzLGZjLEJXLEMsRCxhMCxhMSxhMixiMSxiMiwqeFszXSwqeVszXTsKKwlmbG9hdCBsZm9fZGVwdGgsIGxmb19jZW50ZXI7CisJdW5zaWduZWQgaW50IGNoYW5uZWxzOworfTsKKworc3RhdGljIGludCBlZmZlY3RfaW5pdChzdHJ1Y3QgbG9va2JhY2sgKmxvb3BiYWNrLAorCQkgICAgICAgdm9pZCAqcHJpdmF0ZV9kYXRhLAorCQkgICAgICAgc25kX3BjbV9hY2Nlc3NfdCBhY2Nlc3MsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbHMsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgcmF0ZSwKKwkJICAgICAgIHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0KQoreworCXN0cnVjdCBlZmZlY3RfcHJpdmF0ZSAqcHJpdiA9IHByaXZhdGVfZGF0YTsKKwlpbnQgaTsKKworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKwlpZiAoZm9ybWF0ICE9IFNORF9QQ01fRk9STUFUX1MxNl9MRSkKKwkJcmV0dXJuIC1FSU87CisjZWxpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJaWYgKGZvcm1hdCAhPSBTTkRfUENNX0ZPUk1BVF9TMTZfQkUpCisJCXJldHVybiAtRUlPOworI2Vsc2UKKwlyZXR1cm4gLUVJTzsKKyNlbmRpZgorCXByaXYtPmZzID0gKGZsb2F0KSByYXRlOworCXByaXYtPmNoYW5uZWxzID0gY2hhbm5lbHM7CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlwcml2LT54W2ldID0gY2FsbG9jKGNoYW5uZWxzICogc2l6ZW9mKGZsb2F0KSk7CisJCXByaXYtPnlbaV0gPSBjYWxsb2MoY2hhbm5lbHMgKiBzaXplb2YoZmxvYXQpKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZWZmZWN0X2RvbmUoc3RydWN0IGxvb3BiYWNrICpsb29wYmFjaywKKwkJICAgICAgIHZvaWQgKnByaXZhdGVfZGF0YSkKK3sKKwlzdHJ1Y3QgZWZmZWN0X3ByaXZhdGUgKnByaXYgPSBwcml2YXRlX2RhdGE7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCWZyZWUocHJpdi0+eFtpXSk7CisJCWZyZWUocHJpdi0+eVtpXSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVmZmVjdF9hcHBseShzdHJ1Y3QgbG9vcGJhY2sgKmxvb3BiYWNrLAorCQkJdm9pZCAqcHJpdmF0ZV9kYXRhLAorCQkJY29uc3Qgc25kX3BjbV9jaGFubmVsX2FyZWFfdCAqYXJlYXMsCisJCQlzbmRfdWZyYW1lc190IG9mZnNldCwKKwkJCXNuZF91ZnJhbWVzX3QgZnJhbWVzKQoreworCXN0cnVjdCBlZmZlY3RfcHJpdmF0ZSAqcHJpdiA9IHByaXZhdGVfZGF0YTsKKwlzaG9ydCAqc2FtcGxlcyA9IChzaG9ydCopYXJlYXNbMF0uYWRkciArIG9mZnNldCpwcml2LT5jaGFubmVsczsKKwlzbmRfdWZyYW1lc190IGk7CisKKwlmb3IgKGk9MDsgaSA8IGZyYW1lczsgaSsrKSB7CisJCWludCBjaG47CisKKwkJZmMgPSBzaW4ocHJpdi0+bGZvKSpwcml2LT5sZm9fZGVwdGgrcHJpdi0+bGZvX2NlbnRlcjsKKwkJcHJpdi0+bGZvICs9IHByaXYtPmRsZm87CisJCWlmIChwcml2LT5sZm8+Mi4qTV9QSSkgcHJpdi0+bGZvIC09IDIuKk1fUEk7CisJCXByaXYtPkMgPSAxLi90YW4oTV9QSSpwcml2LT5CVy9wcml2LT5mcyk7CisJCXByaXYtPkQgPSAyLipjb3MoMipNX1BJKmZjL2ZzKTsKKwkJcHJpdi0+YTAgPSAxLi8oMS4rcHJpdi0+Qyk7CisJCXByaXYtPmExID0gMDsKKwkJcHJpdi0+YTIgPSAtcHJpdi0+YTA7CisJCXByaXYtPmIxID0gLXByaXYtPkMqcHJpdi0+RCphMDsKKwkJcHJpdi0+YjIgPSAocHJpdi0+Qy0xKSpwcml2LT5hMDsKKworCQlmb3IgKGNobj0wOyBjaG4gPCBwcml2LT5jaGFubmVsczsgY2huKyspCisJCXsKKwkJCXByaXYtPnhbY2huXVsyXSA9IHByaXYtPnhbY2huXVsxXTsKKwkJCXByaXYtPnhbY2huXVsxXSA9IHByaXYtPnhbY2huXVswXTsKKworCQkJcHJpdi0+eVtjaG5dWzJdID0gcHJpdi0+eVtjaG5dWzFdOworCQkJcHJpdi0+eVtjaG5dWzFdID0gcHJpdi0+eVtjaG5dWzBdOworCisJCQlwcml2LT54W2Nobl1bMF0gPSBzYW1wbGVzW2kqY2hhbm5lbHMrY2huXTsKKwkJCXByaXYtPnlbY2huXVswXSA9IHByaXYtPmEwKnByaXYtPnhbMF1bY2huXQorCQkJCSsgcHJpdi0+YTEqcHJpdi0+eFsxXVtjaG5dICsgcHJpdi0+YTIqeFsyXVtjaG5dCisJCQkJLSBwcml2LT5iMSpwcml2LT55WzFdW2Nobl0gLSBwcml2LT5iMip5WzJdW2Nobl07CisJCQlzYW1wbGVzW2kqY2hhbm5lbHMrY2huXSA9IHByaXYtPnlbY2huXVswXTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBlZmZlY3RfaW5pdF9zd2VlcCh2b2lkKQoreworCXN0cnVjdCBlZmZlY3RfcHJpdmF0ZSAqcHJpdjsKKworCXByaXYgPSByZWdpc3Rlcl9lZmZlY3QoZWZmZWN0X2luaXQsCisJCQkgICAgICAgZWZmZWN0X2FwcGx5LAorCQkJICAgICAgIGVmZmVjdF9kb25lLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZWZmZWN0cHJpdmF0ZSkpOworCWlmIChwcml2KSB7CisJCXByaXYtPmxmb19jZW50ZXIgPSAyMDAwLjsKKwkJcHJpdi0+bGZvX2RlcHRoID0gMTgwMC47CisJCXByaXYtPmxmb19mcmVxID0gMC4yOworCQlwcml2LT5CVyA9IDUwOworCX0KK30KZGlmZiAtLWdpdCBhL2Fsc2Fsb29wL3BjbWpvYi5jIGIvYWxzYWxvb3AvcGNtam9iLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZhYzJkMwotLS0gL2Rldi9udWxsCisrKyBiL2Fsc2Fsb29wL3BjbWpvYi5jCkBAIC0wLDAgKzEsMTk1MyBAQAorLyoKKyAqICBBIHNpbXBsZSBQQ00gbG9vcGJhY2sgdXRpbGl0eQorICogIENvcHlyaWdodCAoYykgMjAxMCBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICoKKyAqICAgICBBdXRob3I6IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGFsc2EvYXNvdW5kbGliLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgImFsc2Fsb29wLmgiCisKKyNkZWZpbmUgWFJVTl9QUk9GSUxFX1VOS05PV04gKC0xMDAwMDAwMCkKKworc3RhdGljIGludCBzZXRfcmF0ZV9zaGlmdChzdHJ1Y3QgbG9vcGJhY2tfaGFuZGxlICpsaGFuZGxlLCBkb3VibGUgcGl0Y2gpOworc3RhdGljIGludCBnZXRfcmF0ZShzdHJ1Y3QgbG9vcGJhY2tfaGFuZGxlICpsaGFuZGxlKTsKKworI2RlZmluZSBTWU5DVFlQRSh2KSBbU1lOQ19UWVBFXyMjdl0gPSAjdgorCitzdGF0aWMgY29uc3QgY2hhciAqc3luY190eXBlc1tdID0geworCVNZTkNUWVBFKE5PTkUpLAorCVNZTkNUWVBFKFNJTVBMRSksCisJU1lOQ1RZUEUoQ0FQVFJBVEVTSElGVCksCisJU1lOQ1RZUEUoUExBWVJBVEVTSElGVCksCisJU1lOQ1RZUEUoU0FNUExFUkFURSksCisJU1lOQ1RZUEUoQVVUTykKK307CisKKyNkZWZpbmUgU1JDVFlQRSh2KSBbU1JDXyMjdl0gPSAiU1JDXyIgI3YKKworI2lmZGVmIFVTRV9TQU1QTEVSQVRFCitzdGF0aWMgY29uc3QgY2hhciAqc3JjX3R5cGVzW10gPSB7CisJU1JDVFlQRShTSU5DX0JFU1RfUVVBTElUWSksCisJU1JDVFlQRShTSU5DX01FRElVTV9RVUFMSVRZKSwKKwlTUkNUWVBFKFNJTkNfRkFTVEVTVCksCisJU1JDVFlQRShaRVJPX09SREVSX0hPTEQpLAorCVNSQ1RZUEUoTElORUFSKQorfTsKKyNlbmRpZgorCitzdGF0aWMgcHRocmVhZF9tdXRleF90IHBjbV9vcGVuX211dGV4ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlA7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY21fb3Blbl9sb2NrKHZvaWQpCit7CisJaWYgKHdvcmthcm91bmRzICYgV09SS0FST1VORF9TRVJJQUxPUEVOKQorCSAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZwY21fb3Blbl9tdXRleCk7Cit9CisgCitzdGF0aWMgaW5saW5lIHZvaWQgcGNtX29wZW5fdW5sb2NrKHZvaWQpCit7CisJaWYgKHdvcmthcm91bmRzICYgV09SS0FST1VORF9TRVJJQUxPUEVOKQorCSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnBjbV9vcGVuX211dGV4KTsKK30KKworc3RhdGljIGlubGluZSBzbmRfcGNtX3VmcmFtZXNfdCBnZXRfd2hvbGVfbGF0ZW5jeShzdHJ1Y3QgbG9vcGJhY2sgKmxvb3ApCit7CisJcmV0dXJuIGxvb3AtPmxhdGVuY3k7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nCisJCQlmcmFtZXNfdG9fdGltZSh1bnNpZ25lZCBpbnQgcmF0ZSwKKwkJCQkgICAgICAgc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzKQoreworCXJldHVybiAoZnJhbWVzICogMTAwMDAwMFVMTCkgLyByYXRlOworfQorCitzdGF0aWMgaW5saW5lIHNuZF9wY21fdWZyYW1lc190IHRpbWVfdG9fZnJhbWVzKHVuc2lnbmVkIGludCByYXRlLAorCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHRpbWUpCit7CisJcmV0dXJuICh0aW1lICogcmF0ZSkgLyAxMDAwMDAwVUxMOworfQorCitzdGF0aWMgaW50IHNldHBhcmFtc19zdHJlYW0oc3RydWN0IGxvb3BiYWNrX2hhbmRsZSAqbGhhbmRsZSwKKwkJCSAgICBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpCit7CisJc25kX3BjbV90ICpoYW5kbGUgPSBsaGFuZGxlLT5oYW5kbGU7CisJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgcnJhdGU7CisKKwllcnIgPSBzbmRfcGNtX2h3X3BhcmFtc19hbnkoaGFuZGxlLCBwYXJhbXMpOworCWlmIChlcnIgPCAwKSB7CisJCWxvZ2l0KExPR19DUklULCAiQnJva2VuIGNvbmZpZ3VyYXRpb24gZm9yICVzIFBDTTogbm8gY29uZmlndXJhdGlvbnMgYXZhaWxhYmxlOiAlc1xuIiwgbGhhbmRsZS0+aWQsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJZXJyID0gc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfcmVzYW1wbGUoaGFuZGxlLCBwYXJhbXMsIGxoYW5kbGUtPnJlc2FtcGxlKTsKKwlpZiAoZXJyIDwgMCkgeworCQlsb2dpdChMT0dfQ1JJVCwgIlJlc2FtcGxlIHNldHVwIGZhaWxlZCBmb3IgJXMgKHZhbCAlaSk6ICVzXG4iLCBsaGFuZGxlLT5pZCwgbGhhbmRsZS0+cmVzYW1wbGUsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJZXJyID0gc25kX3BjbV9od19wYXJhbXNfc2V0X2FjY2VzcyhoYW5kbGUsIHBhcmFtcywgbGhhbmRsZS0+YWNjZXNzKTsKKwlpZiAoZXJyIDwgMCkgeworCQlsb2dpdChMT0dfQ1JJVCwgIkFjY2VzcyB0eXBlIG5vdCBhdmFpbGFibGUgZm9yICVzOiAlc1xuIiwgbGhhbmRsZS0+aWQsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJZXJyID0gc25kX3BjbV9od19wYXJhbXNfc2V0X2Zvcm1hdChoYW5kbGUsIHBhcmFtcywgbGhhbmRsZS0+Zm9ybWF0KTsKKwlpZiAoZXJyIDwgMCkgeworCQlsb2dpdChMT0dfQ1JJVCwgIlNhbXBsZSBmb3JtYXQgbm90IGF2YWlsYWJsZSBmb3IgJXM6ICVzXG4iLCBsaGFuZGxlLT5pZCwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gZXJyOworCX0KKwllcnIgPSBzbmRfcGNtX2h3X3BhcmFtc19zZXRfY2hhbm5lbHMoaGFuZGxlLCBwYXJhbXMsIGxoYW5kbGUtPmNoYW5uZWxzKTsKKwlpZiAoZXJyIDwgMCkgeworCQlsb2dpdChMT0dfQ1JJVCwgIkNoYW5uZWxzIGNvdW50ICglaSkgbm90IGF2YWlsYWJsZSBmb3IgJXM6ICVzXG4iLCBsaGFuZGxlLT5jaGFubmVscywgbGhhbmRsZS0+aWQsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJcnJhdGUgPSBsaGFuZGxlLT5yYXRlX3JlcTsKKwllcnIgPSBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZV9uZWFyKGhhbmRsZSwgcGFyYW1zLCAmcnJhdGUsIDApOworCWlmIChlcnIgPCAwKSB7CisJCWxvZ2l0KExPR19DUklULCAiUmF0ZSAlaUh6IG5vdCBhdmFpbGFibGUgZm9yICVzOiAlc1xuIiwgbGhhbmRsZS0+cmF0ZV9yZXEsIGxoYW5kbGUtPmlkLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybiBlcnI7CisJfQorCXJyYXRlID0gMDsKKwlzbmRfcGNtX2h3X3BhcmFtc19nZXRfcmF0ZShwYXJhbXMsICZycmF0ZSwgMCk7CisJbGhhbmRsZS0+cmF0ZSA9IHJyYXRlOworCWlmICgKKyNpZmRlZiBVU0VfU0FNUExFUkFURQorCSAgICAhbGhhbmRsZS0+bG9vcGJhY2stPnNyY19lbmFibGUgJiYKKyNlbmRpZgorCSAgICAoaW50KXJyYXRlICE9IGxoYW5kbGUtPnJhdGUpIHsKKwkJbG9naXQoTE9HX0NSSVQsICJSYXRlIGRvZXMgbm90IG1hdGNoIChyZXF1ZXN0ZWQgJWlIeiwgZ290ICVpSHosIHJlc2FtcGxlICVpKVxuIiwgbGhhbmRsZS0+cmF0ZSwgcnJhdGUsIGxoYW5kbGUtPnJlc2FtcGxlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWxoYW5kbGUtPnBpdGNoID0gKGRvdWJsZSlsaGFuZGxlLT5yYXRlX3JlcSAvIChkb3VibGUpbGhhbmRsZS0+cmF0ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRwYXJhbXNfYnVmc2l6ZShzdHJ1Y3QgbG9vcGJhY2tfaGFuZGxlICpsaGFuZGxlLAorCQkJICAgICBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsCisJCQkgICAgIHNuZF9wY21faHdfcGFyYW1zX3QgKnRwYXJhbXMsCisJCQkgICAgIHNuZF9wY21fdWZyYW1lc190IGJ1ZnNpemUpCit7CisJc25kX3BjbV90ICpoYW5kbGUgPSBsaGFuZGxlLT5oYW5kbGU7CisJaW50IGVycjsKKwlzbmRfcGNtX3VmcmFtZXNfdCBwZXJpb2RzaXplOworCXNuZF9wY21fdWZyYW1lc190IGJ1ZmZlcnNpemU7CisJc25kX3BjbV91ZnJhbWVzX3QgbGFzdF9idWZzaXplID0gMDsKKworCWlmIChsaGFuZGxlLT5idWZmZXJfc2l6ZV9yZXEgPiAwKSB7CisJCWJ1ZnNpemUgPSBsaGFuZGxlLT5idWZmZXJfc2l6ZV9yZXE7CisJCWxhc3RfYnVmc2l6ZSA9IGJ1ZnNpemU7CisJCWdvdG8gX19zZXRfaXQ7CisJfQorICAgICAgX19hZ2FpbjoKKwlpZiAobGhhbmRsZS0+YnVmZmVyX3NpemVfcmVxID4gMCkgeworCQlsb2dpdChMT0dfQ1JJVCwgIlVuYWJsZSB0byBzZXQgYnVmZmVyIHNpemUgJWxpIGZvciAlc1xuIiwgKGxvbmcpbGhhbmRsZS0+YnVmZmVyX3NpemUsIGxoYW5kbGUtPmlkKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmIChsYXN0X2J1ZnNpemUgPT0gYnVmc2l6ZSkKKwkJYnVmc2l6ZSArPSA0OworCWxhc3RfYnVmc2l6ZSA9IGJ1ZnNpemU7CisJaWYgKGJ1ZnNpemUgPiAxMCoxMDI0KjEwMjQpIHsKKwkJbG9naXQoTE9HX0NSSVQsICJCdWZmZXIgc2l6ZSB0b28gYmlnXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorICAgICAgX19zZXRfaXQ6CisJc25kX3BjbV9od19wYXJhbXNfY29weShwYXJhbXMsIHRwYXJhbXMpOworCXBlcmlvZHNpemUgPSBidWZzaXplICogODsKKwllcnIgPSBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3NpemVfbmVhcihoYW5kbGUsIHBhcmFtcywgJnBlcmlvZHNpemUpOworCWlmIChlcnIgPCAwKSB7CisJCWxvZ2l0KExPR19DUklULCAiVW5hYmxlIHRvIHNldCBidWZmZXIgc2l6ZSAlbGkgZm9yICVzOiAlc1xuIiwgcGVyaW9kc2l6ZSwgbGhhbmRsZS0+aWQsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJZ290byBfX2FnYWluOworCX0KKwlzbmRfcGNtX2h3X3BhcmFtc19nZXRfYnVmZmVyX3NpemUocGFyYW1zLCAmcGVyaW9kc2l6ZSk7CisJaWYgKHZlcmJvc2UgPiA2KQorCQlzbmRfb3V0cHV0X3ByaW50ZihsaGFuZGxlLT5sb29wYmFjay0+b3V0cHV0LCAiJXM6IGJ1ZmZlcl9zaXplPSVsaVxuIiwgbGhhbmRsZS0+aWQsIHBlcmlvZHNpemUpOworCWlmIChsaGFuZGxlLT5wZXJpb2Rfc2l6ZV9yZXEgPiAwKQorCQlwZXJpb2RzaXplID0gbGhhbmRsZS0+cGVyaW9kX3NpemVfcmVxOworCWVsc2UKKwkJcGVyaW9kc2l6ZSAvPSA4OworCWVyciA9IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2Rfc2l6ZV9uZWFyKGhhbmRsZSwgcGFyYW1zLCAmcGVyaW9kc2l6ZSwgMCk7CisJaWYgKGVyciA8IDApIHsKKwkJbG9naXQoTE9HX0NSSVQsICJVbmFibGUgdG8gc2V0IHBlcmlvZCBzaXplICVsaSBmb3IgJXM6ICVzXG4iLCBwZXJpb2RzaXplLCBsaGFuZGxlLT5pZCwgc25kX3N0cmVycm9yKGVycikpOworCQlnb3RvIF9fYWdhaW47CisJfQorCXNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2Rfc2l6ZShwYXJhbXMsICZwZXJpb2RzaXplLCBOVUxMKTsKKwlpZiAodmVyYm9zZSA+IDYpCisJCXNuZF9vdXRwdXRfcHJpbnRmKGxoYW5kbGUtPmxvb3BiYWNrLT5vdXRwdXQsICIlczogcGVyaW9kX3NpemU9JWxpXG4iLCBsaGFuZGxlLT5pZCwgcGVyaW9kc2l6ZSk7CisJaWYgKHBlcmlvZHNpemUgIT0gYnVmc2l6ZSkKKwkJYnVmc2l6ZSA9IHBlcmlvZHNpemU7CisJc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplKHBhcmFtcywgJmJ1ZmZlcnNpemUpOworCWlmIChwZXJpb2RzaXplICogMiA+IGJ1ZmZlcnNpemUpCisJCWdvdG8gX19hZ2FpbjsKKwlsaGFuZGxlLT5wZXJpb2Rfc2l6ZSA9IHBlcmlvZHNpemU7CisJbGhhbmRsZS0+YnVmZmVyX3NpemUgPSBidWZmZXJzaXplOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldHBhcmFtc19zZXQoc3RydWN0IGxvb3BiYWNrX2hhbmRsZSAqbGhhbmRsZSwKKwkJCSBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsCisJCQkgc25kX3BjbV9zd19wYXJhbXNfdCAqc3dwYXJhbXMsCisJCQkgc25kX3BjbV91ZnJhbWVzX3QgYnVmc2l6ZSkKK3sKKwlzbmRfcGNtX3QgKmhhbmRsZSA9IGxoYW5kbGUtPmhhbmRsZTsKKwlpbnQgZXJyOworCXNuZF9wY21fdWZyYW1lc190IHZhbCwgcGVyaW9kX3NpemUsIGJ1ZmZlcl9zaXplOworCisJZXJyID0gc25kX3BjbV9od19wYXJhbXMoaGFuZGxlLCBwYXJhbXMpOworCWlmIChlcnIgPCAwKSB7CisJCWxvZ2l0KExPR19DUklULCAiVW5hYmxlIHRvIHNldCBodyBwYXJhbXMgZm9yICVzOiAlc1xuIiwgbGhhbmRsZS0+aWQsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJZXJyID0gc25kX3BjbV9zd19wYXJhbXNfY3VycmVudChoYW5kbGUsIHN3cGFyYW1zKTsKKwlpZiAoZXJyIDwgMCkgeworCQlsb2dpdChMT0dfQ1JJVCwgIlVuYWJsZSB0byBkZXRlcm1pbmUgY3VycmVudCBzd3BhcmFtcyBmb3IgJXM6ICVzXG4iLCBsaGFuZGxlLT5pZCwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gZXJyOworCX0KKwllcnIgPSBzbmRfcGNtX3N3X3BhcmFtc19zZXRfc3RhcnRfdGhyZXNob2xkKGhhbmRsZSwgc3dwYXJhbXMsIDB4N2ZmZmZmZmYpOworCWlmIChlcnIgPCAwKSB7CisJCWxvZ2l0KExPR19DUklULCAiVW5hYmxlIHRvIHNldCBzdGFydCB0aHJlc2hvbGQgbW9kZSBmb3IgJXM6ICVzXG4iLCBsaGFuZGxlLT5pZCwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gZXJyOworCX0KKwlzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3NpemUocGFyYW1zLCAmcGVyaW9kX3NpemUsIE5VTEwpOworCXNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfc2l6ZShwYXJhbXMsICZidWZmZXJfc2l6ZSk7CisJaWYgKGxoYW5kbGUtPm5ibG9jaykgeworCQlpZiAobGhhbmRsZSA9PSBsaGFuZGxlLT5sb29wYmFjay0+cGxheSkgeworCQkJdmFsID0gYnVmZmVyX3NpemUgLSAoMiAqIHBlcmlvZF9zaXplIC0gNCk7CisJCX0gZWxzZSB7CisJCQl2YWwgPSA0OworCQl9CisJCWlmICh2ZXJib3NlID4gNikKKwkJCXNuZF9vdXRwdXRfcHJpbnRmKGxoYW5kbGUtPmxvb3BiYWNrLT5vdXRwdXQsICIlczogYXZhaWxfbWluMT0lbGlcbiIsIGxoYW5kbGUtPmlkLCB2YWwpOworCX0gZWxzZSB7CisJCWlmIChsaGFuZGxlID09IGxoYW5kbGUtPmxvb3BiYWNrLT5wbGF5KSB7CisJCQl2YWwgPSBidWZzaXplICsgYnVmc2l6ZSAvIDI7CisJCQlpZiAodmFsIDwgKHBlcmlvZF9zaXplICogMykgLyA0KQorCQkJCXZhbCA9IChwZXJpb2Rfc2l6ZSAqIDMpIC8gNDsKKwkJCWlmICh2YWwgPiAoYnVmZmVyX3NpemUgKiAzKSAvIDQpCisJCQkJdmFsID0gKGJ1ZmZlcl9zaXplICogMykgLyA0OworCQkJdmFsID0gYnVmZmVyX3NpemUgLSB2YWw7CisJCX0gZWxzZSB7CisJCQl2YWwgPSBidWZzaXplIC8gMjsKKwkJCWlmICh2YWwgPCBwZXJpb2Rfc2l6ZSAvIDIpCisJCQkJdmFsID0gcGVyaW9kX3NpemUgLyAyOworCQkJaWYgKHZhbCA+IGJ1ZmZlcl9zaXplIC8gNCkKKwkJCQl2YWwgPSBidWZmZXJfc2l6ZSAvIDQ7CisJCX0KKwkJaWYgKHZlcmJvc2UgPiA2KQorCQkJc25kX291dHB1dF9wcmludGYobGhhbmRsZS0+bG9vcGJhY2stPm91dHB1dCwgIiVzOiBhdmFpbF9taW4yPSVsaVxuIiwgbGhhbmRsZS0+aWQsIHZhbCk7CisJfQorCWVyciA9IHNuZF9wY21fc3dfcGFyYW1zX3NldF9hdmFpbF9taW4oaGFuZGxlLCBzd3BhcmFtcywgdmFsKTsKKwlpZiAoZXJyIDwgMCkgeworCQlsb2dpdChMT0dfQ1JJVCwgIlVuYWJsZSB0byBzZXQgYXZhaWwgbWluIGZvciAlczogJXNcbiIsIGxoYW5kbGUtPmlkLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybiBlcnI7CisJfQorCXNuZF9wY21fc3dfcGFyYW1zX2dldF9hdmFpbF9taW4oc3dwYXJhbXMsICZsaGFuZGxlLT5hdmFpbF9taW4pOworCWVyciA9IHNuZF9wY21fc3dfcGFyYW1zKGhhbmRsZSwgc3dwYXJhbXMpOworCWlmIChlcnIgPCAwKSB7CisJCWxvZ2l0KExPR19DUklULCAiVW5hYmxlIHRvIHNldCBzdyBwYXJhbXMgZm9yICVzOiAlc1xuIiwgbGhhbmRsZS0+aWQsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0cGFyYW1zKHN0cnVjdCBsb29wYmFjayAqbG9vcCwgc25kX3BjbV91ZnJhbWVzX3QgYnVmc2l6ZSkKK3sKKwlpbnQgZXJyOworCXNuZF9wY21faHdfcGFyYW1zX3QgKnB0X3BhcmFtcywgKmN0X3BhcmFtczsJLyogdGVtcGxhdGVzIHdpdGggcmF0ZSwgZm9ybWF0IGFuZCBjaGFubmVscyAqLworCXNuZF9wY21faHdfcGFyYW1zX3QgKnBfcGFyYW1zLCAqY19wYXJhbXM7CisJc25kX3BjbV9zd19wYXJhbXNfdCAqcF9zd3BhcmFtcywgKmNfc3dwYXJhbXM7CisKKwlzbmRfcGNtX2h3X3BhcmFtc19hbGxvY2EoJnBfcGFyYW1zKTsKKwlzbmRfcGNtX2h3X3BhcmFtc19hbGxvY2EoJmNfcGFyYW1zKTsKKwlzbmRfcGNtX2h3X3BhcmFtc19hbGxvY2EoJnB0X3BhcmFtcyk7CisJc25kX3BjbV9od19wYXJhbXNfYWxsb2NhKCZjdF9wYXJhbXMpOworCXNuZF9wY21fc3dfcGFyYW1zX2FsbG9jYSgmcF9zd3BhcmFtcyk7CisJc25kX3BjbV9zd19wYXJhbXNfYWxsb2NhKCZjX3N3cGFyYW1zKTsKKwlpZiAoKGVyciA9IHNldHBhcmFtc19zdHJlYW0obG9vcC0+cGxheSwgcHRfcGFyYW1zKSkgPCAwKSB7CisJCWxvZ2l0KExPR19DUklULCAiVW5hYmxlIHRvIHNldCBwYXJhbWV0ZXJzIGZvciAlcyBzdHJlYW06ICVzXG4iLCBsb29wLT5wbGF5LT5pZCwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gZXJyOworCX0KKwlpZiAoKGVyciA9IHNldHBhcmFtc19zdHJlYW0obG9vcC0+Y2FwdCwgY3RfcGFyYW1zKSkgPCAwKSB7CisJCWxvZ2l0KExPR19DUklULCAiVW5hYmxlIHRvIHNldCBwYXJhbWV0ZXJzIGZvciAlcyBzdHJlYW06ICVzXG4iLCBsb29wLT5jYXB0LT5pZCwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICgoZXJyID0gc2V0cGFyYW1zX2J1ZnNpemUobG9vcC0+cGxheSwgcF9wYXJhbXMsIHB0X3BhcmFtcywgYnVmc2l6ZSAvIGxvb3AtPnBsYXktPnBpdGNoKSkgPCAwKSB7CisJCWxvZ2l0KExPR19DUklULCAiVW5hYmxlIHRvIHNldCBidWZmZXIgcGFyYW1ldGVycyBmb3IgJXMgc3RyZWFtOiAlc1xuIiwgbG9vcC0+cGxheS0+aWQsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKChlcnIgPSBzZXRwYXJhbXNfYnVmc2l6ZShsb29wLT5jYXB0LCBjX3BhcmFtcywgY3RfcGFyYW1zLCBidWZzaXplIC8gbG9vcC0+Y2FwdC0+cGl0Y2gpKSA8IDApIHsKKwkJbG9naXQoTE9HX0NSSVQsICJVbmFibGUgdG8gc2V0IGJ1ZmZlciBwYXJhbWV0ZXJzIGZvciAlcyBzdHJlYW06ICVzXG4iLCBsb29wLT5jYXB0LT5pZCwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICgoZXJyID0gc2V0cGFyYW1zX3NldChsb29wLT5wbGF5LCBwX3BhcmFtcywgcF9zd3BhcmFtcywgYnVmc2l6ZSAvIGxvb3AtPnBsYXktPnBpdGNoKSkgPCAwKSB7CisJCWxvZ2l0KExPR19DUklULCAiVW5hYmxlIHRvIHNldCBzdyBwYXJhbWV0ZXJzIGZvciAlcyBzdHJlYW06ICVzXG4iLCBsb29wLT5wbGF5LT5pZCwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gZXJyOworCX0KKwlpZiAoKGVyciA9IHNldHBhcmFtc19zZXQobG9vcC0+Y2FwdCwgY19wYXJhbXMsIGNfc3dwYXJhbXMsIGJ1ZnNpemUgLyBsb29wLT5jYXB0LT5waXRjaCkpIDwgMCkgeworCQlsb2dpdChMT0dfQ1JJVCwgIlVuYWJsZSB0byBzZXQgc3cgcGFyYW1ldGVycyBmb3IgJXMgc3RyZWFtOiAlc1xuIiwgbG9vcC0+Y2FwdC0+aWQsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKyNpZiAwCisJaWYgKCFsb29wLT5saW5rZWQpCisJCWlmIChzbmRfcGNtX2xpbmsobG9vcC0+Y2FwdC0+aGFuZGxlLCBsb29wLT5wbGF5LT5oYW5kbGUpID49IDApCisJCQlsb29wLT5saW5rZWQgPSAxOworI2VuZGlmCisJaWYgKChlcnIgPSBzbmRfcGNtX3ByZXBhcmUobG9vcC0+cGxheS0+aGFuZGxlKSkgPCAwKSB7CisJCWxvZ2l0KExPR19DUklULCAiUHJlcGFyZSAlcyBlcnJvcjogJXNcbiIsIGxvb3AtPnBsYXktPmlkLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybiBlcnI7CisJfQorCWlmICghbG9vcC0+bGlua2VkICYmIChlcnIgPSBzbmRfcGNtX3ByZXBhcmUobG9vcC0+Y2FwdC0+aGFuZGxlKSkgPCAwKSB7CisJCWxvZ2l0KExPR19DUklULCAiUHJlcGFyZSAlcyBlcnJvcjogJXNcbiIsIGxvb3AtPmNhcHQtPmlkLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKHZlcmJvc2UpIHsKKwkJc25kX3BjbV9kdW1wKGxvb3AtPnBsYXktPmhhbmRsZSwgbG9vcC0+b3V0cHV0KTsKKwkJc25kX3BjbV9kdW1wKGxvb3AtPmNhcHQtPmhhbmRsZSwgbG9vcC0+b3V0cHV0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dsYXRlbmN5KHNuZF9vdXRwdXRfdCAqb3V0LCBzaXplX3QgbGF0ZW5jeSwgdW5zaWduZWQgaW50IHJhdGUsCisJCQljaGFyICpwcmVmaXgpCit7CisJZG91YmxlIGQ7CisJZCA9IChkb3VibGUpbGF0ZW5jeSAvIChkb3VibGUpcmF0ZTsKKwlzbmRfb3V0cHV0X3ByaW50ZihvdXQsICIlcyAlbGkgZnJhbWVzLCAlLjNmdXMsICUuNmZtcyAoJS40Zkh6KVxuIiwgcHJlZml4LCAobG9uZylsYXRlbmN5LCBkICogMTAwMDAwMCwgZCAqIDEwMDAsIChkb3VibGUpMSAvIGQpOworfQorCitzdGF0aWMgbG9uZyB0aW1lZGlmZihzbmRfdGltZXN0YW1wX3QgdDEsIHNuZF90aW1lc3RhbXBfdCB0MikKK3sKKwlzaWduZWQgbG9uZyBsOworCisJdDEudHZfc2VjIC09IHQyLnR2X3NlYzsKKwlpZiAodDEudHZfdXNlYyA8IHQyLnR2X3VzZWMpIHsKKwkJbCA9ICgodDEudHZfdXNlYyArIDEwMDAwMDApIC0gdDIudHZfdXNlYykgJSAxMDAwMDAwOworCQl0MS50dl9zZWMtLTsKKwl9IGVsc2UgeworCQlsID0gdDEudHZfdXNlYyAtIHQyLnR2X3VzZWM7CisJfQorCXJldHVybiAodDEudHZfc2VjICogMTAwMDAwMCkgKyBsOworfQorCitzdGF0aWMgaW50IGdldGN1cnRpbWVzdGFtcChzbmRfdGltZXN0YW1wX3QgKnRzKQoreworCXN0cnVjdCB0aW1ldmFsIHR2OworCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCXRzLT50dl9zZWMgPSB0di50dl9zZWM7CisJdHMtPnR2X3VzZWMgPSB0di50dl91c2VjOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB4cnVuX3Byb2ZpbGUwKHN0cnVjdCBsb29wYmFjayAqbG9vcCkKK3sKKwlzbmRfcGNtX3NmcmFtZXNfdCBwZGVsYXksIGNkZWxheTsKKworCWlmIChzbmRfcGNtX2RlbGF5KGxvb3AtPnBsYXktPmhhbmRsZSwgJnBkZWxheSkgPj0gMCAmJgorCSAgICBzbmRfcGNtX2RlbGF5KGxvb3AtPmNhcHQtPmhhbmRsZSwgJmNkZWxheSkgPj0gMCkgeworCQlnZXRjdXJ0aW1lc3RhbXAoJmxvb3AtPnhydW5fbGFzdF91cGRhdGUpOworCQlsb29wLT54cnVuX2xhc3RfcGRlbGF5ID0gcGRlbGF5OworCQlsb29wLT54cnVuX2xhc3RfY2RlbGF5ID0gY2RlbGF5OworCQlsb29wLT54cnVuX2J1Zl9wY291bnQgPSBsb29wLT5wbGF5LT5idWZfY291bnQ7CisJCWxvb3AtPnhydW5fYnVmX2Njb3VudCA9IGxvb3AtPmNhcHQtPmJ1Zl9jb3VudDsKKyNpZmRlZiBVU0VfU0FNUExFUkFURQorCQlsb29wLT54cnVuX291dF9mcmFtZXMgPSBsb29wLT5zcmNfb3V0X2ZyYW1lczsKKyNlbmRpZgorCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHhydW5fcHJvZmlsZShzdHJ1Y3QgbG9vcGJhY2sgKmxvb3ApCit7CisJaWYgKGxvb3AtPnhydW4pCisJCXhydW5fcHJvZmlsZTAobG9vcCk7Cit9CisKK3N0YXRpYyB2b2lkIHhydW5fc3RhdHMwKHN0cnVjdCBsb29wYmFjayAqbG9vcCkKK3sKKwlzbmRfdGltZXN0YW1wX3QgdDsKKwlkb3VibGUgZXhwZWN0ZWQsIGxhc3QsIHdha2UsIGNoZWNrLCBxdWV1ZWQgPSAtMSwgcHJvYywgbWlzc2luZyA9IC0xOworCWRvdWJsZSBtYXhidWYsIHBmaWxsZWQsIGNmaWxsZWQsIGNxdWV1ZWQgPSAtMSwgYXZhaWxfbWluOworCWRvdWJsZSBzaW5jZWpvYjsKKworCWV4cGVjdGVkID0gKChkb3VibGUpbG9vcC0+bGF0ZW5jeSAvCisJCQkJKGRvdWJsZSlsb29wLT5wbGF5LT5yYXRlX3JlcSkgKiAxMDAwOworCWdldGN1cnRpbWVzdGFtcCgmdCk7CisJbGFzdCA9IChkb3VibGUpdGltZWRpZmYodCwgbG9vcC0+eHJ1bl9sYXN0X3VwZGF0ZSkgLyAxMDAwOworCXdha2UgPSAoZG91YmxlKXRpbWVkaWZmKHQsIGxvb3AtPnhydW5fbGFzdF93YWtlKSAvIDEwMDA7CisJY2hlY2sgPSAoZG91YmxlKXRpbWVkaWZmKHQsIGxvb3AtPnhydW5fbGFzdF9jaGVjaykgLyAxMDAwOworCXNpbmNlam9iID0gKGRvdWJsZSl0aW1lZGlmZih0LCBsb29wLT50c3RhbXBfc3RhcnQpIC8gMTAwMDsKKwlpZiAobG9vcC0+eHJ1bl9sYXN0X3BkZWxheSAhPSBYUlVOX1BST0ZJTEVfVU5LTk9XTikKKwkJcXVldWVkID0gKChkb3VibGUpbG9vcC0+eHJ1bl9sYXN0X3BkZWxheSAvCisJCQkJKGRvdWJsZSlsb29wLT5wbGF5LT5yYXRlKSAqIDEwMDA7CisJaWYgKGxvb3AtPnhydW5fbGFzdF9jZGVsYXkgIT0gWFJVTl9QUk9GSUxFX1VOS05PV04pCisJCWNxdWV1ZWQgPSAoKGRvdWJsZSlsb29wLT54cnVuX2xhc3RfY2RlbGF5IC8KKwkJCQkoZG91YmxlKWxvb3AtPmNhcHQtPnJhdGUpICogMTAwMDsKKwltYXhidWYgPSAoKGRvdWJsZSlsb29wLT5wbGF5LT5idWZmZXJfc2l6ZSAvCisJCQkJKGRvdWJsZSlsb29wLT5wbGF5LT5yYXRlKSAqIDEwMDA7CisJcHJvYyA9IChkb3VibGUpbG9vcC0+eHJ1bl9tYXhfcHJvY3RpbWUgLyAxMDAwOworCXBmaWxsZWQgPSAoKGRvdWJsZSkobG9vcC0+eHJ1bl9idWZfcGNvdW50ICsgbG9vcC0+eHJ1bl9vdXRfZnJhbWVzKSAvCisJCQkJKGRvdWJsZSlsb29wLT5wbGF5LT5yYXRlKSAqIDEwMDA7CisJY2ZpbGxlZCA9ICgoZG91YmxlKWxvb3AtPnhydW5fYnVmX2Njb3VudCAvCisJCQkJKGRvdWJsZSlsb29wLT5jYXB0LT5yYXRlKSAqIDEwMDA7CisJYXZhaWxfbWluID0gKCgoZG91YmxlKWxvb3AtPnBsYXktPmJ1ZmZlcl9zaXplIC0gCisJCQkJKGRvdWJsZSlsb29wLT5wbGF5LT5hdmFpbF9taW4gKSAvIAorCQkJCShkb3VibGUpbG9vcC0+cGxheS0+cmF0ZSkgKiAxMDAwOworCWF2YWlsX21pbiA9IGV4cGVjdGVkIC0gYXZhaWxfbWluOworCWlmIChxdWV1ZWQgPj0gMCkKKwkJbWlzc2luZyA9IGxhc3QgLSBxdWV1ZWQ7CisJaWYgKG1pc3NpbmcgPj0gMCAmJiBsb29wLT54cnVuX21heF9taXNzaW5nIDwgbWlzc2luZykKKwkJbG9vcC0+eHJ1bl9tYXhfbWlzc2luZyA9IG1pc3Npbmc7CisJbG9vcC0+eHJ1bl9tYXhfcHJvY3RpbWUgPSAwOworCWdldGN1cnRpbWVzdGFtcCgmdCk7CisJbG9naXQoTE9HX0lORk8sICIgIGxhc3Qgd3JpdGUgYmVmb3JlICUuNGZtcywgcXVldWVkICUuNGZtcy8lLjRmbXMgLT4gbWlzc2luZyAlLjRmbXNcbiIsIGxhc3QsIHF1ZXVlZCwgY3F1ZXVlZCwgbWlzc2luZyk7CisJbG9naXQoTE9HX0lORk8sICIgIGV4cGVjdGVkICUuNGZtcywgcHJvY2Vzc2luZyAlLjRmbXMsIG1heCBtaXNzaW5nICUuNGZtc1xuIiwgZXhwZWN0ZWQsIHByb2MsIGxvb3AtPnhydW5fbWF4X21pc3NpbmcpOworCWxvZ2l0KExPR19JTkZPLCAiICBsYXN0IHdha2UgJS40Zm1zLCBsYXN0IGNoZWNrICUuNGZtcywgYXZhaWxfbWluICUuNGZtc1xuIiwgd2FrZSwgY2hlY2ssIGF2YWlsX21pbik7CisJbG9naXQoTE9HX0lORk8sICIgIG1heCBidWYgJS40Zm1zLCBwZmlsbGVkICUuNGZtcywgY2ZpbGxlZCAlLjRmbXNcbiIsIG1heGJ1ZiwgcGZpbGxlZCwgY2ZpbGxlZCk7CisJbG9naXQoTE9HX0lORk8sICIgIGpvYiBzdGFydGVkIGJlZm9yZSAlLjRmbXNcbiIsIHNpbmNlam9iKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHhydW5fc3RhdHMoc3RydWN0IGxvb3BiYWNrICpsb29wKQoreworCWlmIChsb29wLT54cnVuKQorCQl4cnVuX3N0YXRzMChsb29wKTsKK30KKworc3RhdGljIGlubGluZSBzbmRfcGNtX3VmcmFtZXNfdCBidWZfYXZhaWwoc3RydWN0IGxvb3BiYWNrX2hhbmRsZSAqbGhhbmRsZSkKK3sKKwlyZXR1cm4gbGhhbmRsZS0+YnVmX3NpemUgLSBsaGFuZGxlLT5idWZfY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIGJ1Zl9yZW1vdmUoc3RydWN0IGxvb3BiYWNrICpsb29wLCBzbmRfcGNtX3VmcmFtZXNfdCBjb3VudCkKK3sKKwkvKiByZW1vdmUgc2FtcGxlcyBmcm9tIHRoZSBjYXB0dXJlIGJ1ZmZlciAqLworCWlmIChjb3VudCA8PSAwKQorCQlyZXR1cm47CisJaWYgKGxvb3AtPnBsYXktPmJ1ZiA9PSBsb29wLT5jYXB0LT5idWYpIHsKKwkJaWYgKGNvdW50IDwgbG9vcC0+Y2FwdC0+YnVmX2NvdW50KQorCQkJbG9vcC0+Y2FwdC0+YnVmX2NvdW50IC09IGNvdW50OworCQllbHNlCisJCQlsb29wLT5jYXB0LT5idWZfY291bnQgPSAwOworCX0KK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIGJ1Zl9hZGRfY29weShzdHJ1Y3QgbG9vcGJhY2sgKmxvb3ApCit7CisJc3RydWN0IGxvb3BiYWNrX2hhbmRsZSAqY2FwdCA9IGxvb3AtPmNhcHQ7CisJc3RydWN0IGxvb3BiYWNrX2hhbmRsZSAqcGxheSA9IGxvb3AtPnBsYXk7CisJc25kX3BjbV91ZnJhbWVzX3QgY291bnQsIGNvdW50MSwgY3BvcywgcHBvczsKKworCWNvdW50ID0gY2FwdC0+YnVmX2NvdW50OworCWNwb3MgPSBjYXB0LT5idWZfcG9zIC0gY291bnQ7CisJaWYgKGNwb3MgPiBjYXB0LT5idWZfc2l6ZSkKKwkJY3BvcyArPSBjYXB0LT5idWZfc2l6ZTsKKwlwcG9zID0gKHBsYXktPmJ1Zl9wb3MgKyBwbGF5LT5idWZfY291bnQpICUgcGxheS0+YnVmX3NpemU7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQljb3VudDEgPSBjb3VudDsKKwkJaWYgKGNvdW50MSArIGNwb3MgPiBjYXB0LT5idWZfc2l6ZSkKKwkJCWNvdW50MSA9IGNhcHQtPmJ1Zl9zaXplIC0gY3BvczsKKwkJaWYgKGNvdW50MSA+IGJ1Zl9hdmFpbChwbGF5KSkKKwkJCWNvdW50MSA9IGJ1Zl9hdmFpbChwbGF5KTsKKwkJaWYgKGNvdW50MSArIHBwb3MgPiBwbGF5LT5idWZfc2l6ZSkKKwkJCWNvdW50MSA9IHBsYXktPmJ1Zl9zaXplIC0gcHBvczsKKwkJaWYgKGNvdW50MSA9PSAwKQorCQkJYnJlYWs7CisJCW1lbWNweShwbGF5LT5idWYgKyBwcG9zICogcGxheS0+ZnJhbWVfc2l6ZSwKKwkJICAgICAgIGNhcHQtPmJ1ZiArIGNwb3MgKiBjYXB0LT5mcmFtZV9zaXplLAorCQkgICAgICAgY291bnQxICogY2FwdC0+ZnJhbWVfc2l6ZSk7CisJCXBsYXktPmJ1Zl9jb3VudCArPSBjb3VudDE7CisJCWNhcHQtPmJ1Zl9jb3VudCAtPSBjb3VudDE7CisJCXBwb3MgKz0gY291bnQxOworCQlwcG9zICU9IHBsYXktPmJ1Zl9zaXplOworCQljcG9zICs9IGNvdW50MTsKKwkJY3BvcyAlPSBjYXB0LT5idWZfc2l6ZTsKKwkJY291bnQgLT0gY291bnQxOworCX0KK30KKyNlbmRpZgorCisjaWZkZWYgVVNFX1NBTVBMRVJBVEUKK3N0YXRpYyB2b2lkIGJ1Zl9hZGRfc3JjKHN0cnVjdCBsb29wYmFjayAqbG9vcCkKK3sKKwlzdHJ1Y3QgbG9vcGJhY2tfaGFuZGxlICpjYXB0ID0gbG9vcC0+Y2FwdDsKKwlzdHJ1Y3QgbG9vcGJhY2tfaGFuZGxlICpwbGF5ID0gbG9vcC0+cGxheTsKKwlmbG9hdCAqb2xkX2RhdGFfb3V0OworCXNuZF9wY21fdWZyYW1lc190IGNvdW50LCBwb3MsIGNvdW50MSwgcG9zMTsKKwljb3VudCA9IGNhcHQtPmJ1Zl9jb3VudDsKKwlwb3MgPSAwOworCXBvczEgPSBjYXB0LT5idWZfcG9zIC0gY291bnQ7CisJaWYgKHBvczEgPiBjYXB0LT5idWZfc2l6ZSkKKwkJcG9zMSArPSBjYXB0LT5idWZfc2l6ZTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCWNvdW50MSA9IGNvdW50OworCQlpZiAoY291bnQxICsgcG9zMSA+IGNhcHQtPmJ1Zl9zaXplKQorCQkJY291bnQxID0gY2FwdC0+YnVmX3NpemUgLSBwb3MxOworCQlpZiAoY2FwdC0+Zm9ybWF0ID09IFNORF9QQ01fRk9STUFUX1MzMikKKwkJCXNyY19pbnRfdG9fZmxvYXRfYXJyYXkoKGludCAqKShjYXB0LT5idWYgKworCQkJCQkJcG9zMSAqIGNhcHQtPmZyYW1lX3NpemUpLAorCQkJCQkgbG9vcC0+c3JjX2RhdGEuZGF0YV9pbiArCisJCQkJCSAgIHBvcyAqIGNhcHQtPmNoYW5uZWxzLAorCQkJCQkgY291bnQxICogY2FwdC0+Y2hhbm5lbHMpOworCQllbHNlCisJCQlzcmNfc2hvcnRfdG9fZmxvYXRfYXJyYXkoKHNob3J0ICopKGNhcHQtPmJ1ZiArCisJCQkJCQlwb3MxICogY2FwdC0+ZnJhbWVfc2l6ZSksCisJCQkJCSBsb29wLT5zcmNfZGF0YS5kYXRhX2luICsKKwkJCQkJICAgcG9zICogY2FwdC0+Y2hhbm5lbHMsCisJCQkJCSBjb3VudDEgKiBjYXB0LT5jaGFubmVscyk7CisJCWNvdW50IC09IGNvdW50MTsKKwkJcG9zICs9IGNvdW50MTsKKwkJcG9zMSArPSBjb3VudDE7CisJCXBvczEgJT0gY2FwdC0+YnVmX3NpemU7CisJfQorCWxvb3AtPnNyY19kYXRhLmlucHV0X2ZyYW1lcyA9IHBvczsKKwlsb29wLT5zcmNfZGF0YS5vdXRwdXRfZnJhbWVzID0gcGxheS0+YnVmX3NpemUgLQorCQkJCQkJbG9vcC0+c3JjX291dF9mcmFtZXM7CisJbG9vcC0+c3JjX2RhdGEuZW5kX29mX2lucHV0ID0gMDsKKwlvbGRfZGF0YV9vdXQgPSBsb29wLT5zcmNfZGF0YS5kYXRhX291dDsKKwlsb29wLT5zcmNfZGF0YS5kYXRhX291dCA9IG9sZF9kYXRhX291dCArIGxvb3AtPnNyY19vdXRfZnJhbWVzOworCXNyY19wcm9jZXNzKGxvb3AtPnNyY19zdGF0ZSwgJmxvb3AtPnNyY19kYXRhKTsKKwlsb29wLT5zcmNfZGF0YS5kYXRhX291dCA9IG9sZF9kYXRhX291dDsKKwljYXB0LT5idWZfY291bnQgLT0gbG9vcC0+c3JjX2RhdGEuaW5wdXRfZnJhbWVzX3VzZWQ7CisJY291bnQgPSBsb29wLT5zcmNfZGF0YS5vdXRwdXRfZnJhbWVzX2dlbiArCisJCWxvb3AtPnNyY19vdXRfZnJhbWVzOworCXBvcyA9IDA7CisJcG9zMSA9IChwbGF5LT5idWZfcG9zICsgcGxheS0+YnVmX2NvdW50KSAlIHBsYXktPmJ1Zl9zaXplOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJY291bnQxID0gY291bnQ7CisJCWlmIChjb3VudDEgKyBwb3MxID4gcGxheS0+YnVmX3NpemUpCisJCQljb3VudDEgPSBwbGF5LT5idWZfc2l6ZSAtIHBvczE7CisJCWlmIChjb3VudDEgPiBidWZfYXZhaWwocGxheSkpCisJCQljb3VudDEgPSBidWZfYXZhaWwocGxheSk7CisJCWlmIChjb3VudDEgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoY2FwdC0+Zm9ybWF0ID09IFNORF9QQ01fRk9STUFUX1MzMikKKwkJCXNyY19mbG9hdF90b19pbnRfYXJyYXkobG9vcC0+c3JjX2RhdGEuZGF0YV9vdXQgKworCQkJCQkgICBwb3MgKiBwbGF5LT5jaGFubmVscywKKwkJCQkJIChpbnQgKikocGxheS0+YnVmICsKKwkJCQkJICAgcG9zMSAqIHBsYXktPmZyYW1lX3NpemUpLAorCQkJCQkgY291bnQxICogcGxheS0+Y2hhbm5lbHMpOworCQllbHNlCisJCQlzcmNfZmxvYXRfdG9fc2hvcnRfYXJyYXkobG9vcC0+c3JjX2RhdGEuZGF0YV9vdXQgKworCQkJCQkgICBwb3MgKiBwbGF5LT5jaGFubmVscywKKwkJCQkJIChzaG9ydCAqKShwbGF5LT5idWYgKworCQkJCQkgICBwb3MxICogcGxheS0+ZnJhbWVfc2l6ZSksCisJCQkJCSBjb3VudDEgKiBwbGF5LT5jaGFubmVscyk7CisJCXBsYXktPmJ1Zl9jb3VudCArPSBjb3VudDE7CisJCWNvdW50IC09IGNvdW50MTsKKwkJcG9zICs9IGNvdW50MTsKKwkJcG9zMSArPSBjb3VudDE7CisJCXBvczEgJT0gcGxheS0+YnVmX3NpemU7CisJfQorI2lmIDAKKwlwcmludGYoInNyYzogcG9zID0gJWxpLCBnZW4gPSAlbGksIG91dCA9ICVsaSwgY291bnQgPSAlbGlcbiIsCisJCShsb25nKXBvcywgKGxvbmcpbG9vcC0+c3JjX2RhdGEub3V0cHV0X2ZyYW1lc19nZW4sCisJCShsb25nKWxvb3AtPnNyY19vdXRfZnJhbWVzLCBwbGF5LT5idWZfY291bnQpOworI2VuZGlmCisJbG9vcC0+c3JjX291dF9mcmFtZXMgPSAobG9vcC0+c3JjX2RhdGEub3V0cHV0X2ZyYW1lc19nZW4gKworCQkJCQlsb29wLT5zcmNfb3V0X2ZyYW1lcykgLSBwb3M7CisJaWYgKGxvb3AtPnNyY19vdXRfZnJhbWVzID4gMCkgeworCQltZW1tb3ZlKGxvb3AtPnNyY19kYXRhLmRhdGFfb3V0LAorCQkJbG9vcC0+c3JjX2RhdGEuZGF0YV9vdXQgKyBwb3MgKiBwbGF5LT5jaGFubmVscywKKwkJCWxvb3AtPnNyY19vdXRfZnJhbWVzICogcGxheS0+Y2hhbm5lbHMgKiBzaXplb2YoZmxvYXQpKTsKKwl9Cit9CisjZWxzZQorc3RhdGljIHZvaWQgYnVmX2FkZF9zcmMoc3RydWN0IGxvb3BiYWNrICpsb29wKQoreworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGJ1Zl9hZGQoc3RydWN0IGxvb3BiYWNrICpsb29wLCBzbmRfcGNtX3VmcmFtZXNfdCBjb3VudCkKK3sKKwkvKiBjb3B5IHNhbXBsZXMgZnJvbSBjYXB0dXJlIHRvIHBsYXliYWNrIGJ1ZmZlciAqLworCWlmIChjb3VudCA8PSAwKQorCQlyZXR1cm47CisJaWYgKGxvb3AtPnBsYXktPmJ1ZiA9PSBsb29wLT5jYXB0LT5idWYpIHsKKwkJbG9vcC0+cGxheS0+YnVmX2NvdW50ICs9IGNvdW50OworCX0gZWxzZSB7CisJCWJ1Zl9hZGRfc3JjKGxvb3ApOworCX0KK30KKworc3RhdGljIGludCB4cnVuKHN0cnVjdCBsb29wYmFja19oYW5kbGUgKmxoYW5kbGUpCit7CisJaW50IGVycjsKKworCWlmIChsaGFuZGxlID09IGxoYW5kbGUtPmxvb3BiYWNrLT5wbGF5KSB7CisJCWxvZ2l0KExPR19ERUJVRywgInVuZGVycnVuIGZvciAlc1xuIiwgbGhhbmRsZS0+aWQpOworCQl4cnVuX3N0YXRzKGxoYW5kbGUtPmxvb3BiYWNrKTsKKwkJaWYgKChlcnIgPSBzbmRfcGNtX3ByZXBhcmUobGhhbmRsZS0+aGFuZGxlKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJbGhhbmRsZS0+eHJ1bl9wZW5kaW5nID0gMTsKKwl9IGVsc2UgeworCQlsb2dpdChMT0dfREVCVUcsICJvdmVycnVuIGZvciAlc1xuIiwgbGhhbmRsZS0+aWQpOworCQl4cnVuX3N0YXRzKGxoYW5kbGUtPmxvb3BiYWNrKTsKKwkJaWYgKChlcnIgPSBzbmRfcGNtX3ByZXBhcmUobGhhbmRsZS0+aGFuZGxlKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJbGhhbmRsZS0+eHJ1bl9wZW5kaW5nID0gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3VzcGVuZChzdHJ1Y3QgbG9vcGJhY2tfaGFuZGxlICpsaGFuZGxlKQoreworCWludCBlcnI7CisKKwl3aGlsZSAoKGVyciA9IHNuZF9wY21fcmVzdW1lKGxoYW5kbGUtPmhhbmRsZSkpID09IC1FQUdBSU4pCisJCXVzbGVlcCgxKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIHhydW4obGhhbmRsZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZGl0KHN0cnVjdCBsb29wYmFja19oYW5kbGUgKmxoYW5kbGUpCit7CisJc25kX3BjbV9zZnJhbWVzX3QgciwgcmVzID0gMDsKKwlzbmRfcGNtX3NmcmFtZXNfdCBhdmFpbDsKKwlpbnQgZXJyOworCisJYXZhaWwgPSBzbmRfcGNtX2F2YWlsX3VwZGF0ZShsaGFuZGxlLT5oYW5kbGUpOworCWlmIChhdmFpbCA9PSAtRVBJUEUpIHsKKwkJcmV0dXJuIHhydW4obGhhbmRsZSk7CisJfSBlbHNlIGlmIChhdmFpbCA9PSAtRVNUUlBJUEUpIHsKKwkJaWYgKChlcnIgPSBzdXNwZW5kKGxoYW5kbGUpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlpZiAoYXZhaWwgPiBidWZfYXZhaWwobGhhbmRsZSkpIHsKKwkJbGhhbmRsZS0+YnVmX292ZXIgKz0gYXZhaWwgLSBidWZfYXZhaWwobGhhbmRsZSk7CisJCWF2YWlsID0gYnVmX2F2YWlsKGxoYW5kbGUpOworCX0gZWxzZSBpZiAoYXZhaWwgPT0gMCkgeworCQlpZiAoc25kX3BjbV9zdGF0ZShsaGFuZGxlLT5oYW5kbGUpID09IFNORF9QQ01fU1RBVEVfRFJBSU5JTkcpIHsKKwkJCWxoYW5kbGUtPmxvb3BiYWNrLT5yZWluaXQgPSAxOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJd2hpbGUgKGF2YWlsID4gMCkgeworCQlyID0gYnVmX2F2YWlsKGxoYW5kbGUpOworCQlpZiAociArIGxoYW5kbGUtPmJ1Zl9wb3MgPiBsaGFuZGxlLT5idWZfc2l6ZSkKKwkJCXIgPSBsaGFuZGxlLT5idWZfc2l6ZSAtIGxoYW5kbGUtPmJ1Zl9wb3M7CisJCWlmIChyID4gYXZhaWwpCisJCQlyID0gYXZhaWw7CisJCXIgPSBzbmRfcGNtX3JlYWRpKGxoYW5kbGUtPmhhbmRsZSwKKwkJCQkgIGxoYW5kbGUtPmJ1ZiArCisJCQkJICBsaGFuZGxlLT5idWZfcG9zICoKKwkJCQkgIGxoYW5kbGUtPmZyYW1lX3NpemUsIHIpOworCQlpZiAociA9PSAwKQorCQkJcmV0dXJuIHJlczsKKwkJaWYgKHIgPCAwKSB7CisJCQlpZiAociA9PSAtRVBJUEUpIHsKKwkJCQllcnIgPSB4cnVuKGxoYW5kbGUpOworCQkJCXJldHVybiByZXMgPiAwID8gcmVzIDogZXJyOworCQkJfSBlbHNlIGlmIChyID09IC1FU1RSUElQRSkgeworCQkJCWlmICgoZXJyID0gc3VzcGVuZChsaGFuZGxlKSkgPCAwKQorCQkJCQlyZXR1cm4gcmVzID4gMCA/IHJlcyA6IGVycjsKKwkJCQlyID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIHJlcyA+IDAgPyByZXMgOiByOworCQkJfQorCQl9CisjaWZkZWYgRklMRV9DV1JJVEUKKwkJaWYgKGxoYW5kbGUtPmxvb3BiYWNrLT5jZmlsZSkKKwkJCWZ3cml0ZShsaGFuZGxlLT5idWYgKyBsaGFuZGxlLT5idWZfcG9zICogbGhhbmRsZS0+ZnJhbWVfc2l6ZSwKKwkJCSAgICAgICByLCBsaGFuZGxlLT5mcmFtZV9zaXplLCBsaGFuZGxlLT5sb29wYmFjay0+Y2ZpbGUpOworI2VuZGlmCisJCXJlcyArPSByOworCQlpZiAobGhhbmRsZS0+bWF4IDwgcmVzKQorCQkJbGhhbmRsZS0+bWF4ID0gcmVzOworCQlsaGFuZGxlLT5jb3VudGVyICs9IHI7CisJCWxoYW5kbGUtPmJ1Zl9jb3VudCArPSByOworCQlsaGFuZGxlLT5idWZfcG9zICs9IHI7CisJCWxoYW5kbGUtPmJ1Zl9wb3MgJT0gbGhhbmRsZS0+YnVmX3NpemU7CisJCWF2YWlsIC09IHI7CisJfQorCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVpdChzdHJ1Y3QgbG9vcGJhY2tfaGFuZGxlICpsaGFuZGxlKQoreworCXNuZF9wY21fc2ZyYW1lc190IGF2YWlsOworCXNuZF9wY21fc2ZyYW1lc190IHIsIHJlcyA9IDA7CisJaW50IGVycjsKKworICAgICAgX19hZ2FpbjoKKwlhdmFpbCA9IHNuZF9wY21fYXZhaWxfdXBkYXRlKGxoYW5kbGUtPmhhbmRsZSk7CisJaWYgKGF2YWlsID09IC1FUElQRSkgeworCQlpZiAoKGVyciA9IHhydW4obGhhbmRsZSkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCXJldHVybiByZXM7CisJfSBlbHNlIGlmIChhdmFpbCA9PSAtRVNUUlBJUEUpIHsKKwkJaWYgKChlcnIgPSBzdXNwZW5kKGxoYW5kbGUpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCQlnb3RvIF9fYWdhaW47CisJfQorCXdoaWxlIChhdmFpbCA+IDAgJiYgbGhhbmRsZS0+YnVmX2NvdW50ID4gMCkgeworCQlyID0gbGhhbmRsZS0+YnVmX2NvdW50OworCQlpZiAociArIGxoYW5kbGUtPmJ1Zl9wb3MgPiBsaGFuZGxlLT5idWZfc2l6ZSkKKwkJCXIgPSBsaGFuZGxlLT5idWZfc2l6ZSAtIGxoYW5kbGUtPmJ1Zl9wb3M7CisJCWlmIChyID4gYXZhaWwpCisJCQlyID0gYXZhaWw7CisJCXIgPSBzbmRfcGNtX3dyaXRlaShsaGFuZGxlLT5oYW5kbGUsCisJCQkJICAgbGhhbmRsZS0+YnVmICsKKwkJCQkgICBsaGFuZGxlLT5idWZfcG9zICoKKwkJCQkgICBsaGFuZGxlLT5mcmFtZV9zaXplLCByKTsKKwkJaWYgKHIgPD0gMCkgeworCQkJaWYgKHIgPT0gLUVQSVBFKSB7CisJCQkJaWYgKChlcnIgPSB4cnVuKGxoYW5kbGUpKSA8IDApCisJCQkJCXJldHVybiBlcnI7CisJCQkJcmV0dXJuIHJlczsKKwkJCX0gZWxzZSBpZiAociA9PSAtRVNUUlBJUEUpIHsKKwkJCX0KKwkJCXJldHVybiByZXMgPiAwID8gcmVzIDogcjsKKwkJfQorI2lmZGVmIEZJTEVfUFdSSVRFCisJCWlmIChsaGFuZGxlLT5sb29wYmFjay0+cGZpbGUpCisJCQlmd3JpdGUobGhhbmRsZS0+YnVmICsgbGhhbmRsZS0+YnVmX3BvcyAqIGxoYW5kbGUtPmZyYW1lX3NpemUsCisJCQkgICAgICAgciwgbGhhbmRsZS0+ZnJhbWVfc2l6ZSwgbGhhbmRsZS0+bG9vcGJhY2stPnBmaWxlKTsKKyNlbmRpZgorCQlyZXMgKz0gcjsKKwkJbGhhbmRsZS0+Y291bnRlciArPSByOworCQlsaGFuZGxlLT5idWZfY291bnQgLT0gcjsKKwkJbGhhbmRsZS0+YnVmX3BvcyArPSByOworCQlsaGFuZGxlLT5idWZfcG9zICU9IGxoYW5kbGUtPmJ1Zl9zaXplOworCQl4cnVuX3Byb2ZpbGUobGhhbmRsZS0+bG9vcGJhY2spOworCQlpZiAobGhhbmRsZS0+bG9vcGJhY2stPnN0b3BfcGVuZGluZykgeworCQkJbGhhbmRsZS0+bG9vcGJhY2stPnN0b3BfY291bnQgKz0gcjsKKwkJCWlmIChsaGFuZGxlLT5sb29wYmFjay0+c3RvcF9jb3VudCAqIGxoYW5kbGUtPnBpdGNoID4KKwkJCSAgICBsaGFuZGxlLT5sb29wYmFjay0+bGF0ZW5jeSAqIDMpIHsKKwkJCQlsaGFuZGxlLT5sb29wYmFjay0+c3RvcF9wZW5kaW5nID0gMDsKKwkJCQlsaGFuZGxlLT5sb29wYmFjay0+cmVpbml0ID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgc25kX3BjbV9zZnJhbWVzX3QgcmVtb3ZlX3NhbXBsZXMoc3RydWN0IGxvb3BiYWNrICpsb29wLAorCQkJCQlpbnQgY2FwdHVyZV9wcmVmZXJyZWQsCisJCQkJCXNuZF9wY21fc2ZyYW1lc190IGNvdW50KQoreworCXN0cnVjdCBsb29wYmFja19oYW5kbGUgKnBsYXkgPSBsb29wLT5wbGF5OworCXN0cnVjdCBsb29wYmFja19oYW5kbGUgKmNhcHQgPSBsb29wLT5jYXB0OworCisJaWYgKGxvb3AtPnBsYXktPmJ1ZiA9PSBsb29wLT5jYXB0LT5idWYpIHsKKwkJaWYgKGNvdW50ID4gbG9vcC0+cGxheS0+YnVmX2NvdW50KQorCQkJY291bnQgPSBsb29wLT5wbGF5LT5idWZfY291bnQ7CisJCWlmIChjb3VudCA+IGxvb3AtPmNhcHQtPmJ1Zl9jb3VudCkKKwkJCWNvdW50ID0gbG9vcC0+Y2FwdC0+YnVmX2NvdW50OworCQljYXB0LT5idWZfY291bnQgLT0gY291bnQ7CisJCXBsYXktPmJ1Zl9wb3MgKz0gY291bnQ7CisJCXBsYXktPmJ1Zl9wb3MgJT0gcGxheS0+YnVmX3NpemU7CisJCXBsYXktPmJ1Zl9jb3VudCAtPSBjb3VudDsKKwkJcmV0dXJuIGNvdW50OworCX0KKwlpZiAoY2FwdHVyZV9wcmVmZXJyZWQpIHsKKwkJaWYgKGNvdW50ID4gY2FwdC0+YnVmX2NvdW50KQorCQkJY291bnQgPSBjYXB0LT5idWZfY291bnQ7CisJCWNhcHQtPmJ1Zl9jb3VudCAtPSBjb3VudDsKKwl9IGVsc2UgeworCQlpZiAoY291bnQgPiBwbGF5LT5idWZfY291bnQpCisJCQljb3VudCA9IHBsYXktPmJ1Zl9jb3VudDsKKwkJcGxheS0+YnVmX2NvdW50IC09IGNvdW50OworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgeHJ1bl9zeW5jKHN0cnVjdCBsb29wYmFjayAqbG9vcCkKK3sKKwlzdHJ1Y3QgbG9vcGJhY2tfaGFuZGxlICpwbGF5ID0gbG9vcC0+cGxheTsKKwlzdHJ1Y3QgbG9vcGJhY2tfaGFuZGxlICpjYXB0ID0gbG9vcC0+Y2FwdDsKKwlzbmRfcGNtX3VmcmFtZXNfdCBmaWxsID0gZ2V0X3dob2xlX2xhdGVuY3kobG9vcCk7CisJc25kX3BjbV9zZnJhbWVzX3QgcGRlbGF5LCBjZGVsYXksIGRlbGF5MSwgcGRlbGF5MSwgY2RlbGF5MSwgZGlmZjsKKwlpbnQgZXJyOworCisgICAgICBfX2FnYWluOgorCWlmICh2ZXJib3NlID4gNSkKKwkJc25kX291dHB1dF9wcmludGYobG9vcC0+b3V0cHV0LCAiJXM6IHhydW4gc3luYyAlaSAlaVxuIiwgbG9vcC0+aWQsIGNhcHQtPnhydW5fcGVuZGluZywgcGxheS0+eHJ1bl9wZW5kaW5nKTsKKwlpZiAoY2FwdC0+eHJ1bl9wZW5kaW5nKSB7CisJICAgICAgX19wYWdhaW46CisJCWNhcHQtPnhydW5fcGVuZGluZyA9IDA7CisJCWlmICgoZXJyID0gc25kX3BjbV9wcmVwYXJlKGNhcHQtPmhhbmRsZSkpIDwgMCkgeworCQkJbG9naXQoTE9HX0NSSVQsICIlcyBwcmVwYXJlIGZhaWxlZDogJXNcbiIsIGNhcHQtPmlkLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWlmICgoZXJyID0gc25kX3BjbV9zdGFydChjYXB0LT5oYW5kbGUpKSA8IDApIHsKKwkJCWxvZ2l0KExPR19DUklULCAiJXMgc3RhcnQgZmFpbGVkOiAlc1xuIiwgY2FwdC0+aWQsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9IGVsc2UgeworCQlkaWZmID0gcmVhZGl0KGNhcHQpOworCQlidWZfYWRkKGxvb3AsIGRpZmYpOworCQlpZiAoY2FwdC0+eHJ1bl9wZW5kaW5nKQorCQkJZ290byBfX3BhZ2FpbjsKKwl9CisJLyogc2tpcCBhZGRpdGlvbmFsIHBsYXliYWNrIHNhbXBsZXMgKi8KKwlpZiAoKGVyciA9IHNuZF9wY21fZGVsYXkoY2FwdC0+aGFuZGxlLCAmY2RlbGF5KSkgPCAwKSB7CisJCWlmIChlcnIgPT0gLUVQSVBFKSB7CisJCQljYXB0LT54cnVuX3BlbmRpbmcgPSAxOworCQkJZ290byBfX2FnYWluOworCQl9CisJCWlmIChlcnIgPT0gLUVTVFJQSVBFKSB7CisJCQllcnIgPSBzdXNwZW5kKGNhcHQpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJCWdvdG8gX19hZ2FpbjsKKwkJfQorCQlsb2dpdChMT0dfQ1JJVCwgIiVzIGNhcHR1cmUgZGVsYXkgZmFpbGVkOiAlc1xuIiwgY2FwdC0+aWQsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKChlcnIgPSBzbmRfcGNtX2RlbGF5KHBsYXktPmhhbmRsZSwgJnBkZWxheSkpIDwgMCkgeworCQlpZiAoZXJyID09IC1FUElQRSkgeworCQkJcGRlbGF5ID0gMDsKKwkJCXBsYXktPnhydW5fcGVuZGluZyA9IDE7CisJCX0gZWxzZSBpZiAoZXJyID09IC1FU1RSUElQRSkgeworCQkJZXJyID0gc3VzcGVuZChwbGF5KTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQlnb3RvIF9fYWdhaW47CisJCX0gZWxzZSB7CisJCQlsb2dpdChMT0dfQ1JJVCwgIiVzIHBsYXliYWNrIGRlbGF5IGZhaWxlZDogJXNcbiIsIHBsYXktPmlkLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCWNhcHQtPmNvdW50ZXIgPSBjZGVsYXk7CisJcGxheS0+Y291bnRlciA9IHBkZWxheTsKKwlpZiAocGxheS0+YnVmICE9IGNhcHQtPmJ1ZikKKwkJY2RlbGF5ICs9IGNhcHQtPmJ1Zl9jb3VudDsKKwlwZGVsYXkgKz0gcGxheS0+YnVmX2NvdW50OworI2lmZGVmIFVTRV9TQU1QTEVSQVRFCisJcGRlbGF5ICs9IGxvb3AtPnNyY19vdXRfZnJhbWVzOworI2VuZGlmCisJY2RlbGF5MSA9IGNkZWxheSAqIGNhcHQtPnBpdGNoOworCXBkZWxheTEgPSBwZGVsYXkgKiBwbGF5LT5waXRjaDsKKwlkZWxheTEgPSBjZGVsYXkxICsgcGRlbGF5MTsKKwljYXB0LT50b3RhbF9xdWV1ZWQgPSAwOworCXBsYXktPnRvdGFsX3F1ZXVlZCA9IDA7CisJbG9vcC0+dG90YWxfcXVldWVkX2NvdW50ID0gMDsKKwlsb29wLT5waXRjaF9kaWZmID0gbG9vcC0+cGl0Y2hfZGlmZl9taW4gPSBsb29wLT5waXRjaF9kaWZmX21heCA9IDA7CisJaWYgKHZlcmJvc2UgPiA2KSB7CisJCXNuZF9vdXRwdXRfcHJpbnRmKGxvb3AtPm91dHB1dCwKKwkJCSJzeW5jOiBjZGVsYXk9JWxpKCVsaSksIHBkZWxheT0lbGkoJWxpKSwgZmlsbD0lbGkgKGRlbGF5PSVsaSkiCisjaWZkZWYgVVNFX1NBTVBMRVJBVEUKKwkJCSIsIHNyY19vdXQ9JWxpIgorI2VuZGlmCisJCQkiXG4iLAorCQkJKGxvbmcpY2RlbGF5LCAobG9uZyljZGVsYXkxLCAobG9uZylwZGVsYXksIChsb25nKXBkZWxheTEsCisJCQkobG9uZylmaWxsLCAobG9uZylkZWxheTEKKyNpZmRlZiBVU0VfU0FNUExFUkFURQorCQkJLCAobG9uZylsb29wLT5zcmNfb3V0X2ZyYW1lcworI2VuZGlmCisJCQkpOworCQlzbmRfb3V0cHV0X3ByaW50Zihsb29wLT5vdXRwdXQsCisJCQkic3luYzogY2J1ZmNvdW50PSVsaSwgcGJ1ZmNvdW50PSVsaVxuIiwKKwkJCShsb25nKWNhcHQtPmJ1Zl9jb3VudCwgKGxvbmcpcGxheS0+YnVmX2NvdW50KTsKKwl9CisJaWYgKGRlbGF5MSA+IGZpbGwgJiYgY2FwdC0+Y291bnRlciA+IDApIHsKKwkJaWYgKChlcnIgPSBzbmRfcGNtX2Ryb3AoY2FwdC0+aGFuZGxlKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKChlcnIgPSBzbmRfcGNtX3ByZXBhcmUoY2FwdC0+aGFuZGxlKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKChlcnIgPSBzbmRfcGNtX3N0YXJ0KGNhcHQtPmhhbmRsZSkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWRpZmYgPSByZW1vdmVfc2FtcGxlcyhsb29wLCAxLCAoZGVsYXkxIC0gZmlsbCkgLyBjYXB0LT5waXRjaCk7CisJCWlmICh2ZXJib3NlID4gNikKKwkJCXNuZF9vdXRwdXRfcHJpbnRmKGxvb3AtPm91dHB1dCwKKwkJCQkic3luYzogY2FwdCBzdG9wIHJlbW92ZWQgJWxpIHNhbXBsZXNcbiIsIChsb25nKWRpZmYpOworCQlnb3RvIF9fYWdhaW47CisJfQorCWlmIChkZWxheTEgPiBmaWxsKSB7CisJCWRpZmYgPSAoZGVsYXkxIC0gZmlsbCkgLyBwbGF5LT5waXRjaDsKKwkJaWYgKGRpZmYgPiBwbGF5LT5idWZfY291bnQpCisJCQlkaWZmID0gcGxheS0+YnVmX2NvdW50OworCQlpZiAodmVyYm9zZSA+IDYpCisJCQlzbmRfb3V0cHV0X3ByaW50Zihsb29wLT5vdXRwdXQsCisJCQkJInN5bmM6IHJlbW92aW5nICVsaSBwbGF5YmFjayBzYW1wbGVzLCBkZWxheTE9JWxpXG4iLCAobG9uZylkaWZmLCAobG9uZylkZWxheTEpOworCQlkaWZmID0gcmVtb3ZlX3NhbXBsZXMobG9vcCwgMCwgZGlmZik7CisJCXBkZWxheSAtPSBkaWZmOworCQlwZGVsYXkxID0gcGRlbGF5ICogcGxheS0+cGl0Y2g7CisJCWRlbGF5MSA9IGNkZWxheTEgKyBwZGVsYXkxOworCQlpZiAodmVyYm9zZSA+IDYpCisJCQlzbmRfb3V0cHV0X3ByaW50Zihsb29wLT5vdXRwdXQsCisJCQkJInN5bmM6IHJlbW92ZWQgJWxpIHBsYXliYWNrIHNhbXBsZXMsIGRlbGF5MT0lbGlcbiIsIChsb25nKWRpZmYsIChsb25nKWRlbGF5MSk7CisJfQorCWlmIChkZWxheTEgPiBmaWxsKSB7CisJCWRpZmYgPSAoZGVsYXkxIC0gZmlsbCkgLyBjYXB0LT5waXRjaDsKKwkJaWYgKGRpZmYgPiBjYXB0LT5idWZfY291bnQpCisJCQlkaWZmID0gY2FwdC0+YnVmX2NvdW50OworCQlpZiAodmVyYm9zZSA+IDYpCisJCQlzbmRfb3V0cHV0X3ByaW50Zihsb29wLT5vdXRwdXQsCisJCQkJInN5bmM6IHJlbW92aW5nICVsaSBjYXB0dXJlZCBzYW1wbGVzLCBkZWxheTE9JWxpXG4iLCAobG9uZylkaWZmLCAobG9uZylkZWxheTEpOworCQlkaWZmIC09IHJlbW92ZV9zYW1wbGVzKGxvb3AsIDEsIGRpZmYpOworCQljZGVsYXkgLT0gZGlmZjsKKwkJY2RlbGF5MSA9IGNkZWxheSAqIGNhcHQtPnBpdGNoOworCQlkZWxheTEgPSBjZGVsYXkxICsgcGRlbGF5MTsJCQorCQlpZiAodmVyYm9zZSA+IDYpCisJCQlzbmRfb3V0cHV0X3ByaW50Zihsb29wLT5vdXRwdXQsCisJCQkJInN5bmM6IHJlbW92ZWQgJWxpIGNhcHR1cmVkIHNhbXBsZXMsIGRlbGF5MT0lbGlcbiIsIChsb25nKWRpZmYsIChsb25nKWRlbGF5MSk7CisJfQorCWlmIChwbGF5LT54cnVuX3BlbmRpbmcpIHsKKwkJcGxheS0+eHJ1bl9wZW5kaW5nID0gMDsKKwkJZGlmZiA9IChmaWxsIC0gZGVsYXkxKSAvIHBsYXktPnBpdGNoOworCQlpZiAodmVyYm9zZSA+IDYpCisJCQlzbmRfb3V0cHV0X3ByaW50Zihsb29wLT5vdXRwdXQsCisJCQkJInN5bmM6IHhydW5fcGVuZGluZywgc2lsZW5jZSBmaWxsaW5nICVsaSAvIGJ1Zl9jb3VudD0lbGlcbiIsIChsb25nKWRpZmYsIHBsYXktPmJ1Zl9jb3VudCk7CisJCWlmIChmaWxsID4gZGVsYXkxICYmIHBsYXktPmJ1Zl9jb3VudCA8IGRpZmYpIHsKKwkJCWRpZmYgPSBkaWZmIC0gcGxheS0+YnVmX2NvdW50OworCQkJaWYgKHZlcmJvc2UgPiA2KQorCQkJCXNuZF9vdXRwdXRfcHJpbnRmKGxvb3AtPm91dHB1dCwKKwkJCQkJInN5bmM6IHBsYXliYWNrIHNpbGVuY2UgYWRkZWQgJWxpIHNhbXBsZXNcbiIsIChsb25nKWRpZmYpOworCQkJcGxheS0+YnVmX3BvcyAtPSBkaWZmOworCQkJcGxheS0+YnVmX3BvcyAlPSBwbGF5LT5idWZfc2l6ZTsKKwkJCWlmICgoZXJyID0gc25kX3BjbV9mb3JtYXRfc2V0X3NpbGVuY2UocGxheS0+Zm9ybWF0LCBwbGF5LT5idWYgKyBwbGF5LT5idWZfcG9zICogcGxheS0+Y2hhbm5lbHMsIGRpZmYpKSA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJCXBsYXktPmJ1Zl9jb3VudCArPSBkaWZmOworCQl9CisJCWlmICgoZXJyID0gc25kX3BjbV9wcmVwYXJlKHBsYXktPmhhbmRsZSkpIDwgMCkgeworCQkJbG9naXQoTE9HX0NSSVQsICIlcyBwcmVwYXJlIGZhaWxlZDogJXNcbiIsIHBsYXktPmlkLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJZGVsYXkxID0gd3JpdGVpdChwbGF5KTsKKwkJaWYgKHZlcmJvc2UgPiA2KQorCQkJc25kX291dHB1dF9wcmludGYobG9vcC0+b3V0cHV0LAorCQkJCSJzeW5jOiBwbGF5YmFjayB3cm90ZSAlbGkgc2FtcGxlc1xuIiwgKGxvbmcpZGVsYXkxKTsKKwkJaWYgKGRlbGF5MSA+IGRpZmYpIHsKKwkJCWJ1Zl9yZW1vdmUobG9vcCwgZGVsYXkxIC0gZGlmZik7CisJCQlpZiAodmVyYm9zZSA+IDYpCisJCQkJc25kX291dHB1dF9wcmludGYobG9vcC0+b3V0cHV0LAorCQkJCQkic3luYzogcGxheWJhY2sgYnVmX3JlbW92ZSAlbGkgc2FtcGxlc1xuIiwgKGxvbmcpKGRlbGF5MSAtIGRpZmYpKTsKKwkJfQorCQlpZiAoKGVyciA9IHNuZF9wY21fc3RhcnQocGxheS0+aGFuZGxlKSkgPCAwKSB7CisJCQlsb2dpdChMT0dfQ1JJVCwgIiVzIHN0YXJ0IGZhaWxlZDogJXNcbiIsIHBsYXktPmlkLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCWlmICh2ZXJib3NlID4gNSkgeworCQlzbmRfb3V0cHV0X3ByaW50Zihsb29wLT5vdXRwdXQsICIlczogeHJ1biBzeW5jIG9rXG4iLCBsb29wLT5pZCk7CisJCWlmICh2ZXJib3NlID4gNikgeworCQkJaWYgKHNuZF9wY21fZGVsYXkoY2FwdC0+aGFuZGxlLCAmY2RlbGF5KSA8IDApCisJCQkJY2RlbGF5ID0gLTE7CisJCQlpZiAoc25kX3BjbV9kZWxheShwbGF5LT5oYW5kbGUsICZwZGVsYXkpIDwgMCkKKwkJCQlwZGVsYXkgPSAtMTsKKwkJCWlmIChwbGF5LT5idWYgIT0gY2FwdC0+YnVmKQorCQkJCWNkZWxheSArPSBjYXB0LT5idWZfY291bnQ7CisJCQlwZGVsYXkgKz0gcGxheS0+YnVmX2NvdW50OworI2lmZGVmIFVTRV9TQU1QTEVSQVRFCisJCQlwZGVsYXkgKz0gbG9vcC0+c3JjX291dF9mcmFtZXM7CisjZW5kaWYKKwkJCWNkZWxheTEgPSBjZGVsYXkgKiBjYXB0LT5waXRjaDsKKwkJCXBkZWxheTEgPSBwZGVsYXkgKiBwbGF5LT5waXRjaDsKKwkJCWRlbGF5MSA9IGNkZWxheTEgKyBwZGVsYXkxOworCQkJc25kX291dHB1dF9wcmludGYobG9vcC0+b3V0cHV0LCAiJXM6IHN5bmMgdmVyaWZ5OiAlbGlcbiIsIGxvb3AtPmlkLCBkZWxheTEpOworCQl9CisJfQorCWxvb3AtPnhydW5fbWF4X3Byb2N0aW1lID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfbm90aWZ5KHN0cnVjdCBsb29wYmFja19oYW5kbGUgKmxoYW5kbGUsIGludCBlbmFibGUpCit7CisJaW50IGVycjsKKworCWlmIChsaGFuZGxlLT5jdGxfbm90aWZ5ID09IE5VTEwpCisJCXJldHVybiAwOworCXNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfYm9vbGVhbihsaGFuZGxlLT5jdGxfbm90aWZ5LCAwLCBlbmFibGUpOworCWVyciA9IHNuZF9jdGxfZWxlbV93cml0ZShsaGFuZGxlLT5jdGwsIGxoYW5kbGUtPmN0bF9ub3RpZnkpOworCWlmIChlcnIgPCAwKSB7CisJCWxvZ2l0KExPR19DUklULCAiQ2Fubm90IHNldCBQQ00gTm90aWZ5IGVsZW1lbnQgZm9yICVzOiAlc1xuIiwgbGhhbmRsZS0+aWQsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJZXJyID0gc25kX2N0bF9lbGVtX3JlYWQobGhhbmRsZS0+Y3RsLCBsaGFuZGxlLT5jdGxfbm90aWZ5KTsKKwlpZiAoZXJyIDwgMCkgeworCQlsb2dpdChMT0dfQ1JJVCwgIkNhbm5vdCBnZXQgUENNIE5vdGlmeSBlbGVtZW50IGZvciAlczogJXNcbiIsIGxoYW5kbGUtPmlkLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldF9yYXRlX3NoaWZ0KHN0cnVjdCBsb29wYmFja19oYW5kbGUgKmxoYW5kbGUsIGRvdWJsZSBwaXRjaCkKK3sKKwlpbnQgZXJyOworCisJaWYgKGxoYW5kbGUtPmN0bF9yYXRlX3NoaWZ0ID09IE5VTEwpCisJCXJldHVybiAwOworCXNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfaW50ZWdlcihsaGFuZGxlLT5jdGxfcmF0ZV9zaGlmdCwgMCwgcGl0Y2ggKiAxMDAwMDApOworCWVyciA9IHNuZF9jdGxfZWxlbV93cml0ZShsaGFuZGxlLT5jdGwsIGxoYW5kbGUtPmN0bF9yYXRlX3NoaWZ0KTsKKwlpZiAoZXJyIDwgMCkgeworCQlsb2dpdChMT0dfQ1JJVCwgIkNhbm5vdCBzZXQgUENNIFJhdGUgU2hpZnQgZWxlbWVudCBmb3IgJXM6ICVzXG4iLCBsaGFuZGxlLT5pZCwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCB1cGRhdGVfcGl0Y2goc3RydWN0IGxvb3BiYWNrICpsb29wKQoreworCWRvdWJsZSBwaXRjaCA9IGxvb3AtPnBpdGNoOworCisjaWZkZWYgVVNFX1NBTVBMRVJBVEUKKwlpZiAobG9vcC0+c3luYyA9PSBTWU5DX1RZUEVfU0FNUExFUkFURSkgeworCQlsb29wLT5zcmNfZGF0YS5zcmNfcmF0aW8gPSAoZG91YmxlKTEuMCAvIChwaXRjaCAqCisJCQkJbG9vcC0+cGxheS0+cGl0Y2ggKiBsb29wLT5jYXB0LT5waXRjaCk7CisJCWlmICh2ZXJib3NlID4gMikKKwkJCXNuZF9vdXRwdXRfcHJpbnRmKGxvb3AtPm91dHB1dCwgIiVzOiBTYW1wbGVyYXRlIHNyY19yYXRpbyB1cGRhdGUxOiAlLjhmXG4iLCBsb29wLT5pZCwgbG9vcC0+c3JjX2RhdGEuc3JjX3JhdGlvKTsKKwl9IGVsc2UKKyNlbmRpZgorCWlmIChsb29wLT5zeW5jID09IFNZTkNfVFlQRV9DQVBUUkFURVNISUZUKSB7CisJCXNldF9yYXRlX3NoaWZ0KGxvb3AtPmNhcHQsIHBpdGNoKTsKKyNpZmRlZiBVU0VfU0FNUExFUkFURQorCQlpZiAobG9vcC0+dXNlX3NhbXBsZXJhdGUpIHsKKwkJCWxvb3AtPnNyY19kYXRhLnNyY19yYXRpbyA9IAorCQkJCShkb3VibGUpMS4wIC8KKwkJCQkJKGxvb3AtPnBsYXktPnBpdGNoICogbG9vcC0+Y2FwdC0+cGl0Y2gpOworCQkJaWYgKHZlcmJvc2UgPiAyKQorCQkJCXNuZF9vdXRwdXRfcHJpbnRmKGxvb3AtPm91dHB1dCwgIiVzOiBTYW1wbGVyYXRlIHNyY19yYXRpbyB1cGRhdGUyOiAlLjhmXG4iLCBsb29wLT5pZCwgbG9vcC0+c3JjX2RhdGEuc3JjX3JhdGlvKTsKKwkJfQorI2VuZGlmCisJfQorCWVsc2UgaWYgKGxvb3AtPnN5bmMgPT0gU1lOQ19UWVBFX1BMQVlSQVRFU0hJRlQpIHsKKwkJc2V0X3JhdGVfc2hpZnQobG9vcC0+cGxheSwgcGl0Y2gpOworI2lmZGVmIFVTRV9TQU1QTEVSQVRFCisJCWlmIChsb29wLT51c2Vfc2FtcGxlcmF0ZSkgeworCQkJbG9vcC0+c3JjX2RhdGEuc3JjX3JhdGlvID0gCisJCQkJKGRvdWJsZSkxLjAgLworCQkJCQkobG9vcC0+cGxheS0+cGl0Y2ggKiBsb29wLT5jYXB0LT5waXRjaCk7CisJCQlpZiAodmVyYm9zZSA+IDIpCisJCQkJc25kX291dHB1dF9wcmludGYobG9vcC0+b3V0cHV0LCAiJXM6IFNhbXBsZXJhdGUgc3JjX3JhdGlvIHVwZGF0ZTM6ICUuOGZcbiIsIGxvb3AtPmlkLCBsb29wLT5zcmNfZGF0YS5zcmNfcmF0aW8pOworCQl9CisjZW5kaWYKKwl9CisJaWYgKHZlcmJvc2UpCisJCXNuZF9vdXRwdXRfcHJpbnRmKGxvb3AtPm91dHB1dCwgIk5ldyBwaXRjaCBmb3IgJXM6ICUuOGYgKG1pbi9tYXggc2FtcGxlcyA9ICVsaS8lbGkpXG4iLCBsb29wLT5pZCwgcGl0Y2gsIGxvb3AtPnBpdGNoX2RpZmZfbWluLCBsb29wLT5waXRjaF9kaWZmX21heCk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2FjdGl2ZShzdHJ1Y3QgbG9vcGJhY2tfaGFuZGxlICpsaGFuZGxlKQoreworCWludCBlcnI7CisKKwlpZiAobGhhbmRsZS0+Y3RsX2FjdGl2ZSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwllcnIgPSBzbmRfY3RsX2VsZW1fcmVhZChsaGFuZGxlLT5jdGwsIGxoYW5kbGUtPmN0bF9hY3RpdmUpOworCWlmIChlcnIgPCAwKSB7CisJCWxvZ2l0KExPR19DUklULCAiQ2Fubm90IGdldCBQQ00gU2xhdmUgQWN0aXZlIGVsZW1lbnQgZm9yICVzOiAlc1xuIiwgbGhhbmRsZS0+aWQsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIHNuZF9jdGxfZWxlbV92YWx1ZV9nZXRfYm9vbGVhbihsaGFuZGxlLT5jdGxfYWN0aXZlLCAwKTsKK30KKworc3RhdGljIGludCBnZXRfZm9ybWF0KHN0cnVjdCBsb29wYmFja19oYW5kbGUgKmxoYW5kbGUpCit7CisJaW50IGVycjsKKworCWlmIChsaGFuZGxlLT5jdGxfZm9ybWF0ID09IE5VTEwpCisJCXJldHVybiAwOworCWVyciA9IHNuZF9jdGxfZWxlbV9yZWFkKGxoYW5kbGUtPmN0bCwgbGhhbmRsZS0+Y3RsX2Zvcm1hdCk7CisJaWYgKGVyciA8IDApIHsKKwkJbG9naXQoTE9HX0NSSVQsICJDYW5ub3QgZ2V0IFBDTSBGb3JtYXQgZWxlbWVudCBmb3IgJXM6ICVzXG4iLCBsaGFuZGxlLT5pZCwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9pbnRlZ2VyKGxoYW5kbGUtPmN0bF9mb3JtYXQsIDApOworfQorCitzdGF0aWMgaW50IGdldF9yYXRlKHN0cnVjdCBsb29wYmFja19oYW5kbGUgKmxoYW5kbGUpCit7CisJaW50IGVycjsKKworCWlmIChsaGFuZGxlLT5jdGxfcmF0ZSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwllcnIgPSBzbmRfY3RsX2VsZW1fcmVhZChsaGFuZGxlLT5jdGwsIGxoYW5kbGUtPmN0bF9yYXRlKTsKKwlpZiAoZXJyIDwgMCkgeworCQlsb2dpdChMT0dfQ1JJVCwgIkNhbm5vdCBnZXQgUENNIFJhdGUgZWxlbWVudCBmb3IgJXM6ICVzXG4iLCBsaGFuZGxlLT5pZCwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9pbnRlZ2VyKGxoYW5kbGUtPmN0bF9yYXRlLCAwKTsKK30KKworc3RhdGljIGludCBnZXRfY2hhbm5lbHMoc3RydWN0IGxvb3BiYWNrX2hhbmRsZSAqbGhhbmRsZSkKK3sKKwlpbnQgZXJyOworCisJaWYgKGxoYW5kbGUtPmN0bF9jaGFubmVscyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwllcnIgPSBzbmRfY3RsX2VsZW1fcmVhZChsaGFuZGxlLT5jdGwsIGxoYW5kbGUtPmN0bF9jaGFubmVscyk7CisJaWYgKGVyciA8IDApIHsKKwkJbG9naXQoTE9HX0NSSVQsICJDYW5ub3QgZ2V0IFBDTSBDaGFubmVscyBlbGVtZW50IGZvciAlczogJXNcbiIsIGxoYW5kbGUtPmlkLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybiBlcnI7CisJfQorCXJldHVybiBzbmRfY3RsX2VsZW1fdmFsdWVfZ2V0X2ludGVnZXIobGhhbmRsZS0+Y3RsX2NoYW5uZWxzLCAwKTsKK30KKworc3RhdGljIHZvaWQgb3BlbmN0bF9lbGVtKHN0cnVjdCBsb29wYmFja19oYW5kbGUgKmxoYW5kbGUsCisJCQkgaW50IGRldmljZSwgaW50IHN1YmRldmljZSwKKwkJCSBjb25zdCBjaGFyICpuYW1lLAorCQkJIHNuZF9jdGxfZWxlbV92YWx1ZV90ICoqZWxlbSkKK3sKKwlpbnQgZXJyOworCisJaWYgKHNuZF9jdGxfZWxlbV92YWx1ZV9tYWxsb2MoZWxlbSkgPCAwKSB7CisJCSplbGVtID0gTlVMTDsKKwl9IGVsc2UgeworCQlzbmRfY3RsX2VsZW1fdmFsdWVfc2V0X2ludGVyZmFjZSgqZWxlbSwKKwkJCQkJCSBTTkRfQ1RMX0VMRU1fSUZBQ0VfUENNKTsKKwkJc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9kZXZpY2UoKmVsZW0sIGRldmljZSk7CisJCXNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfc3ViZGV2aWNlKCplbGVtLCBzdWJkZXZpY2UpOworCQlzbmRfY3RsX2VsZW1fdmFsdWVfc2V0X25hbWUoKmVsZW0sIG5hbWUpOworCQllcnIgPSBzbmRfY3RsX2VsZW1fcmVhZChsaGFuZGxlLT5jdGwsICplbGVtKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXNuZF9jdGxfZWxlbV92YWx1ZV9mcmVlKCplbGVtKTsKKwkJCSplbGVtID0gTlVMTDsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBvcGVuY3RsKHN0cnVjdCBsb29wYmFja19oYW5kbGUgKmxoYW5kbGUsIGludCBkZXZpY2UsIGludCBzdWJkZXZpY2UpCit7CisJaW50IGVycjsKKworCWxoYW5kbGUtPmN0bF9yYXRlX3NoaWZ0ID0gTlVMTDsKKwlpZiAobGhhbmRsZS0+bG9vcGJhY2stPnBsYXkgPT0gbGhhbmRsZSkgeworCQlpZiAobGhhbmRsZS0+bG9vcGJhY2stPmNvbnRyb2xzKQorCQkJZ290byBfX2V2ZW50czsKKwkJcmV0dXJuIDA7CisJfQorCW9wZW5jdGxfZWxlbShsaGFuZGxlLCBkZXZpY2UsIHN1YmRldmljZSwgIlBDTSBOb3RpZnkiLAorCQkJJmxoYW5kbGUtPmN0bF9ub3RpZnkpOworCW9wZW5jdGxfZWxlbShsaGFuZGxlLCBkZXZpY2UsIHN1YmRldmljZSwgIlBDTSBSYXRlIFNoaWZ0IDEwMDAwMCIsCisJCQkmbGhhbmRsZS0+Y3RsX3JhdGVfc2hpZnQpOworCXNldF9yYXRlX3NoaWZ0KGxoYW5kbGUsIDEpOworCW9wZW5jdGxfZWxlbShsaGFuZGxlLCBkZXZpY2UsIHN1YmRldmljZSwgIlBDTSBTbGF2ZSBBY3RpdmUiLAorCQkJJmxoYW5kbGUtPmN0bF9hY3RpdmUpOworCW9wZW5jdGxfZWxlbShsaGFuZGxlLCBkZXZpY2UsIHN1YmRldmljZSwgIlBDTSBTbGF2ZSBGb3JtYXQiLAorCQkJJmxoYW5kbGUtPmN0bF9mb3JtYXQpOworCW9wZW5jdGxfZWxlbShsaGFuZGxlLCBkZXZpY2UsIHN1YmRldmljZSwgIlBDTSBTbGF2ZSBSYXRlIiwKKwkJCSZsaGFuZGxlLT5jdGxfcmF0ZSk7CisJb3BlbmN0bF9lbGVtKGxoYW5kbGUsIGRldmljZSwgc3ViZGV2aWNlLCAiUENNIFNsYXZlIENoYW5uZWxzIiwKKwkJCSZsaGFuZGxlLT5jdGxfY2hhbm5lbHMpOworCWlmICgobGhhbmRsZS0+Y3RsX2FjdGl2ZSAmJgorCSAgICAgbGhhbmRsZS0+Y3RsX2Zvcm1hdCAmJgorCSAgICAgbGhhbmRsZS0+Y3RsX3JhdGUgJiYKKwkgICAgIGxoYW5kbGUtPmN0bF9jaGFubmVscykgfHwKKwkgICAgbGhhbmRsZS0+bG9vcGJhY2stPmNvbnRyb2xzKSB7CisJICAgICAgX19ldmVudHM6CisJCWlmICgoZXJyID0gc25kX2N0bF9wb2xsX2Rlc2NyaXB0b3JzX2NvdW50KGxoYW5kbGUtPmN0bCkpIDwgMCkKKwkJCWxoYW5kbGUtPmN0bF9wb2xsZmRfY291bnQgPSAwOworCQllbHNlCisJCQlsaGFuZGxlLT5jdGxfcG9sbGZkX2NvdW50ID0gZXJyOworCQlpZiAoc25kX2N0bF9zdWJzY3JpYmVfZXZlbnRzKGxoYW5kbGUtPmN0bCwgMSkgPCAwKQorCQkJbGhhbmRsZS0+Y3RsX3BvbGxmZF9jb3VudCA9IDA7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wZW5pdChzdHJ1Y3QgbG9vcGJhY2tfaGFuZGxlICpsaGFuZGxlKQoreworCXNuZF9wY21faW5mb190ICppbmZvOworCWludCBzdHJlYW0gPSBsaGFuZGxlID09IGxoYW5kbGUtPmxvb3BiYWNrLT5wbGF5ID8KKwkJCQlTTkRfUENNX1NUUkVBTV9QTEFZQkFDSyA6CisJCQkJU05EX1BDTV9TVFJFQU1fQ0FQVFVSRTsKKwlpbnQgZXJyLCBjYXJkLCBkZXZpY2UsIHN1YmRldmljZTsKKwlwY21fb3Blbl9sb2NrKCk7CisJZXJyID0gc25kX3BjbV9vcGVuKCZsaGFuZGxlLT5oYW5kbGUsIGxoYW5kbGUtPmRldmljZSwgc3RyZWFtLCBTTkRfUENNX05PTkJMT0NLKTsKKwlwY21fb3Blbl91bmxvY2soKTsKKwlpZiAoZXJyIDwgMCkgeworCQlsb2dpdChMT0dfQ1JJVCwgIiVzIG9wZW4gZXJyb3I6ICVzXG4iLCBsaGFuZGxlLT5pZCwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gZXJyOworCX0KKwlpZiAoKGVyciA9IHNuZF9wY21faW5mb19tYWxsb2MoJmluZm8pKSA8IDApCisJCXJldHVybiBlcnI7CisJaWYgKChlcnIgPSBzbmRfcGNtX2luZm8obGhhbmRsZS0+aGFuZGxlLCBpbmZvKSkgPCAwKSB7CisJCXNuZF9wY21faW5mb19mcmVlKGluZm8pOworCQlyZXR1cm4gZXJyOworCX0KKwljYXJkID0gc25kX3BjbV9pbmZvX2dldF9jYXJkKGluZm8pOworCWRldmljZSA9IHNuZF9wY21faW5mb19nZXRfZGV2aWNlKGluZm8pOworCXN1YmRldmljZSA9IHNuZF9wY21faW5mb19nZXRfc3ViZGV2aWNlKGluZm8pOworCXNuZF9wY21faW5mb19mcmVlKGluZm8pOworCWxoYW5kbGUtPmNhcmRfbnVtYmVyID0gY2FyZDsKKwlsaGFuZGxlLT5jdGwgPSBOVUxMOworCWlmIChjYXJkID49IDAgfHwgbGhhbmRsZS0+Y3RsZGV2KSB7CisJCWNoYXIgbmFtZVsxNl0sICpkZXYgPSBsaGFuZGxlLT5jdGxkZXY7CisJCWlmIChkZXYgPT0gTlVMTCkgeworCQkJc3ByaW50ZihuYW1lLCAiaHc6JWkiLCBjYXJkKTsKKwkJCWRldiA9IG5hbWU7CisJCX0KKwkJcGNtX29wZW5fbG9jaygpOworCQllcnIgPSBzbmRfY3RsX29wZW4oJmxoYW5kbGUtPmN0bCwgZGV2LCBTTkRfQ1RMX05PTkJMT0NLKTsKKwkJcGNtX29wZW5fdW5sb2NrKCk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlsb2dpdChMT0dfQ1JJVCwgIiVzIFslc10gY3RsIG9wZW4gZXJyb3I6ICVzXG4iLCBsaGFuZGxlLT5pZCwgZGV2LCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQlsaGFuZGxlLT5jdGwgPSBOVUxMOworCQl9CisJCWlmIChsaGFuZGxlLT5jdGwpCisJCQlvcGVuY3RsKGxoYW5kbGUsIGRldmljZSwgc3ViZGV2aWNlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnJlZWl0KHN0cnVjdCBsb29wYmFja19oYW5kbGUgKmxoYW5kbGUpCit7CisJZnJlZShsaGFuZGxlLT5idWYpOworCWxoYW5kbGUtPmJ1ZiA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2xvc2VpdChzdHJ1Y3QgbG9vcGJhY2tfaGFuZGxlICpsaGFuZGxlKQoreworCWludCBlcnIgPSAwOworCisJc2V0X3JhdGVfc2hpZnQobGhhbmRsZSwgMSk7CisJaWYgKGxoYW5kbGUtPmN0bF9yYXRlX3NoaWZ0KQorCQlzbmRfY3RsX2VsZW1fdmFsdWVfZnJlZShsaGFuZGxlLT5jdGxfcmF0ZV9zaGlmdCk7CisJbGhhbmRsZS0+Y3RsX3JhdGVfc2hpZnQgPSBOVUxMOworCWlmIChsaGFuZGxlLT5jdGwpCisJCWVyciA9IHNuZF9jdGxfY2xvc2UobGhhbmRsZS0+Y3RsKTsKKwlsaGFuZGxlLT5jdGwgPSBOVUxMOworCWlmIChsaGFuZGxlLT5oYW5kbGUpCisJCWVyciA9IHNuZF9wY21fY2xvc2UobGhhbmRsZS0+aGFuZGxlKTsKKwlsaGFuZGxlLT5oYW5kbGUgPSBOVUxMOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9oYW5kbGUoc3RydWN0IGxvb3BiYWNrX2hhbmRsZSAqbGhhbmRsZSwgaW50IGFsbG9jKQoreworCXNuZF9wY21fdWZyYW1lc190IGxhdDsKKwlsaGFuZGxlLT5mcmFtZV9zaXplID0gKHNuZF9wY21fZm9ybWF0X3BoeXNpY2FsX3dpZHRoKGxoYW5kbGUtPmZvcm1hdCkgCisJCQkJCQkvIDgpICogbGhhbmRsZS0+Y2hhbm5lbHM7CisJbGhhbmRsZS0+c3luY19wb2ludCA9IGxoYW5kbGUtPnJhdGUgKiAxNTsJLyogZXZlcnkgMTUgc2Vjb25kcyAqLworCWxhdCA9IGxoYW5kbGUtPmxvb3BiYWNrLT5sYXRlbmN5OworCWlmIChsaGFuZGxlLT5idWZmZXJfc2l6ZSA+IGxhdCkKKwkJbGF0ID0gbGhhbmRsZS0+YnVmZmVyX3NpemU7CisJbGhhbmRsZS0+YnVmX3NpemUgPSBsYXQgKiAyOworCWlmIChhbGxvYykgeworCQlsaGFuZGxlLT5idWYgPSBjYWxsb2MoMSwgbGhhbmRsZS0+YnVmX3NpemUgKiBsaGFuZGxlLT5mcmFtZV9zaXplKTsKKwkJaWYgKGxoYW5kbGUtPmJ1ZiA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorCitpbnQgcGNtam9iX2luaXQoc3RydWN0IGxvb3BiYWNrICpsb29wKQoreworCWludCBlcnI7CisJY2hhciBpZFsxMjhdOworCisjaWZkZWYgRklMRV9DV1JJVEUKKwlsb29wLT5jZmlsZSA9IGZvcGVuKEZJTEVfQ1dSSVRFLCAidysiKTsKKyNlbmRpZgorI2lmZGVmIEZJTEVfUFdSSVRFCisJbG9vcC0+cGZpbGUgPSBmb3BlbihGSUxFX1BXUklURSwgIncrIik7CisjZW5kaWYKKwlpZiAoKGVyciA9IG9wZW5pdChsb29wLT5wbGF5KSkgPCAwKQorCQlnb3RvIF9fZXJyb3I7CisJaWYgKChlcnIgPSBvcGVuaXQobG9vcC0+Y2FwdCkpIDwgMCkKKwkJZ290byBfX2Vycm9yOworCXNucHJpbnRmKGlkLCBzaXplb2YoaWQpLCAiJXMvJXMiLCBsb29wLT5wbGF5LT5pZCwgbG9vcC0+Y2FwdC0+aWQpOworCWlkW3NpemVvZihpZCktMV0gPSAnXDAnOworCWxvb3AtPmlkID0gc3RyZHVwKGlkKTsKKwlpZiAobG9vcC0+c3luYyA9PSBTWU5DX1RZUEVfQVVUTyAmJiBsb29wLT5jYXB0LT5jdGxfcmF0ZV9zaGlmdCkKKwkJbG9vcC0+c3luYyA9IFNZTkNfVFlQRV9DQVBUUkFURVNISUZUOworCWlmIChsb29wLT5zeW5jID09IFNZTkNfVFlQRV9BVVRPICYmIGxvb3AtPnBsYXktPmN0bF9yYXRlX3NoaWZ0KQorCQlsb29wLT5zeW5jID0gU1lOQ19UWVBFX1BMQVlSQVRFU0hJRlQ7CisjaWZkZWYgVVNFX1NBTVBMRVJBVEUKKwlpZiAobG9vcC0+c3luYyA9PSBTWU5DX1RZUEVfQVVUTyAmJiBsb29wLT5zcmNfZW5hYmxlKQorCQlsb29wLT5zeW5jID0gU1lOQ19UWVBFX1NBTVBMRVJBVEU7CisjZW5kaWYKKwlpZiAobG9vcC0+c3luYyA9PSBTWU5DX1RZUEVfQVVUTykKKwkJbG9vcC0+c3luYyA9IFNZTkNfVFlQRV9TSU1QTEU7CisJaWYgKGxvb3AtPnNsYXZlID09IFNMQVZFX1RZUEVfQVVUTyAmJgorCSAgICBsb29wLT5jYXB0LT5jdGxfbm90aWZ5ICYmCisJICAgIGxvb3AtPmNhcHQtPmN0bF9hY3RpdmUgJiYKKwkgICAgbG9vcC0+Y2FwdC0+Y3RsX2Zvcm1hdCAmJgorCSAgICBsb29wLT5jYXB0LT5jdGxfcmF0ZSAmJgorCSAgICBsb29wLT5jYXB0LT5jdGxfY2hhbm5lbHMpCisJCWxvb3AtPnNsYXZlID0gU0xBVkVfVFlQRV9PTjsKKwlpZiAobG9vcC0+c2xhdmUgPT0gU0xBVkVfVFlQRV9PTikgeworCQllcnIgPSBzZXRfbm90aWZ5KGxvb3AtPmNhcHQsIDEpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gX19lcnJvcjsKKwkJaWYgKGxvb3AtPmNhcHQtPmN0bF9ub3RpZnkgPT0gTlVMTCB8fAorCQkgICAgc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9ib29sZWFuKGxvb3AtPmNhcHQtPmN0bF9ub3RpZnksIDApID09IDApIHsKKwkJCWxvZ2l0KExPR19DUklULCAidW5hYmxlIHRvIGVuYWJsZSBzbGF2ZSBtb2RlIGZvciAlc1xuIiwgbG9vcC0+aWQpOworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gX19lcnJvcjsKKwkJfQorCX0KKwllcnIgPSBjb250cm9sX2luaXQobG9vcCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gX19lcnJvcjsKKwlyZXR1cm4gMDsKKyAgICAgIF9fZXJyb3I6CisJcGNtam9iX2RvbmUobG9vcCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgZnJlZWxvb3Aoc3RydWN0IGxvb3BiYWNrICpsb29wKQoreworI2lmZGVmIFVTRV9TQU1QTEVSQVRFCisJaWYgKGxvb3AtPnVzZV9zYW1wbGVyYXRlKSB7CisJCWlmIChsb29wLT5zcmNfc3RhdGUpCisJCQlzcmNfZGVsZXRlKGxvb3AtPnNyY19zdGF0ZSk7CisJCWxvb3AtPnNyY19zdGF0ZSA9IE5VTEw7CisJCWZyZWUobG9vcC0+c3JjX2RhdGEuZGF0YV9pbik7CisJCWxvb3AtPnNyY19kYXRhLmRhdGFfaW4gPSBOVUxMOworCQlmcmVlKGxvb3AtPnNyY19kYXRhLmRhdGFfb3V0KTsKKwkJbG9vcC0+c3JjX2RhdGEuZGF0YV9vdXQgPSBOVUxMOworCX0KKyNlbmRpZgorCWlmIChsb29wLT5wbGF5LT5idWYgPT0gbG9vcC0+Y2FwdC0+YnVmKQorCQlsb29wLT5wbGF5LT5idWYgPSBOVUxMOworCWZyZWVpdChsb29wLT5wbGF5KTsKKwlmcmVlaXQobG9vcC0+Y2FwdCk7Cit9CisKK2ludCBwY21qb2JfZG9uZShzdHJ1Y3QgbG9vcGJhY2sgKmxvb3ApCit7CisJY29udHJvbF9kb25lKGxvb3ApOworCWNsb3NlaXQobG9vcC0+cGxheSk7CisJY2xvc2VpdChsb29wLT5jYXB0KTsKKwlmcmVlbG9vcChsb29wKTsKKwlmcmVlKGxvb3AtPmlkKTsKKwlsb29wLT5pZCA9IE5VTEw7CisjaWZkZWYgRklMRV9QV1JJVEUKKwlpZiAobG9vcC0+cGZpbGUpIHsKKwkJZmNsb3NlKGxvb3AtPnBmaWxlKTsKKwkJbG9vcC0+cGZpbGUgPSBOVUxMOworCX0KKyNlbmRpZgorI2lmZGVmIEZJTEVfQ1dSSVRFCisJaWYgKGxvb3AtPmNmaWxlKSB7CisJCWZjbG9zZShsb29wLT5jZmlsZSk7CisJCWxvb3AtPmNmaWxlID0gTlVMTDsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbGhhbmRsZV9zdGFydChzdHJ1Y3QgbG9vcGJhY2tfaGFuZGxlICpsaGFuZGxlKQoreworCWxoYW5kbGUtPmJ1Zl9wb3MgPSAwOworCWxoYW5kbGUtPmJ1Zl9jb3VudCA9IDA7CisJbGhhbmRsZS0+Y291bnRlciA9IDA7CisJbGhhbmRsZS0+dG90YWxfcXVldWVkID0gMDsKK30KKworc3RhdGljIHZvaWQgZml4X2Zvcm1hdChzdHJ1Y3QgbG9vcGJhY2sgKmxvb3AsIGludCBmb3JjZSkKK3sKKwlzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCA9IGxvb3AtPmNhcHQtPmZvcm1hdDsKKworCWlmICghZm9yY2UgJiYgbG9vcC0+c3luYyAhPSBTWU5DX1RZUEVfU0FNUExFUkFURSkKKwkJcmV0dXJuOworCWlmIChmb3JtYXQgPT0gU05EX1BDTV9GT1JNQVRfUzE2IHx8CisJICAgIGZvcm1hdCA9PSBTTkRfUENNX0ZPUk1BVF9TMzIpCisJCXJldHVybjsKKwlpZiAoc25kX3BjbV9mb3JtYXRfd2lkdGgoZm9ybWF0KSA+IDE2KQorCQlmb3JtYXQgPSBTTkRfUENNX0ZPUk1BVF9TMzI7CisJZWxzZQorCQlmb3JtYXQgPSBTTkRfUENNX0ZPUk1BVF9TMTY7CisJbG9vcC0+Y2FwdC0+Zm9ybWF0ID0gZm9ybWF0OworCWxvb3AtPnBsYXktPmZvcm1hdCA9IGZvcm1hdDsKK30KKworaW50IHBjbWpvYl9zdGFydChzdHJ1Y3QgbG9vcGJhY2sgKmxvb3ApCit7CisJc25kX3BjbV91ZnJhbWVzX3QgY291bnQ7CisJaW50IGVycjsKKworCWxvb3AtPnBvbGxmZF9jb3VudCA9IGxvb3AtPnBsYXktPmN0bF9wb2xsZmRfY291bnQgKworCQkJICAgICBsb29wLT5jYXB0LT5jdGxfcG9sbGZkX2NvdW50OworCWlmICgoZXJyID0gc25kX3BjbV9wb2xsX2Rlc2NyaXB0b3JzX2NvdW50KGxvb3AtPnBsYXktPmhhbmRsZSkpIDwgMCkKKwkJZ290byBfX2Vycm9yOworCWxvb3AtPnBsYXktPnBvbGxmZF9jb3VudCA9IGVycjsKKwlsb29wLT5wb2xsZmRfY291bnQgKz0gZXJyOworCWlmICgoZXJyID0gc25kX3BjbV9wb2xsX2Rlc2NyaXB0b3JzX2NvdW50KGxvb3AtPmNhcHQtPmhhbmRsZSkpIDwgMCkKKwkJZ290byBfX2Vycm9yOworCWxvb3AtPmNhcHQtPnBvbGxmZF9jb3VudCA9IGVycjsKKwlsb29wLT5wb2xsZmRfY291bnQgKz0gZXJyOworCWlmIChsb29wLT5zbGF2ZSA9PSBTTEFWRV9UWVBFX09OKSB7CisJCWVyciA9IGdldF9hY3RpdmUobG9vcC0+Y2FwdCk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBfX2Vycm9yOworCQlpZiAoZXJyID09IDApCQkvKiBzdHJlYW0gaXMgbm90IGFjdGl2ZSAqLworCQkJcmV0dXJuIDA7CisJCWVyciA9IGdldF9mb3JtYXQobG9vcC0+Y2FwdCk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBfX2Vycm9yOworCQlsb29wLT5wbGF5LT5mb3JtYXQgPSBsb29wLT5jYXB0LT5mb3JtYXQgPSBlcnI7CisJCWZpeF9mb3JtYXQobG9vcCwgMCk7CisJCWVyciA9IGdldF9yYXRlKGxvb3AtPmNhcHQpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gX19lcnJvcjsKKwkJbG9vcC0+cGxheS0+cmF0ZV9yZXEgPSBsb29wLT5jYXB0LT5yYXRlX3JlcSA9IGVycjsKKwkJZXJyID0gZ2V0X2NoYW5uZWxzKGxvb3AtPmNhcHQpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gX19lcnJvcjsKKwkJbG9vcC0+cGxheS0+Y2hhbm5lbHMgPSBsb29wLT5jYXB0LT5jaGFubmVscyA9IGVycjsKKwl9CisJbG9vcC0+cmVpbml0ID0gMDsKKwlsb29wLT51c2Vfc2FtcGxlcmF0ZSA9IDA7CitfX2FnYWluOgorCWlmIChsb29wLT5sYXRlbmN5X3JlcSkgeworCQlsb29wLT5sYXRlbmN5X3JlcXRpbWUgPSBmcmFtZXNfdG9fdGltZShsb29wLT5wbGF5LT5yYXRlX3JlcSwKKwkJCQkJCSAgICAgICBsb29wLT5sYXRlbmN5X3JlcSk7CisJCWxvb3AtPmxhdGVuY3lfcmVxID0gMDsKKwl9CisJbG9vcC0+bGF0ZW5jeSA9IHRpbWVfdG9fZnJhbWVzKGxvb3AtPnBsYXktPnJhdGVfcmVxLCBsb29wLT5sYXRlbmN5X3JlcXRpbWUpOworCWlmICgoZXJyID0gc2V0cGFyYW1zKGxvb3AsIGxvb3AtPmxhdGVuY3kvMikpIDwgMCkKKwkJZ290byBfX2Vycm9yOworCWlmICh2ZXJib3NlKQorCQlzaG93bGF0ZW5jeShsb29wLT5vdXRwdXQsIGxvb3AtPmxhdGVuY3ksIGxvb3AtPnBsYXktPnJhdGVfcmVxLCAiTGF0ZW5jeSIpOworCWlmIChsb29wLT5wbGF5LT5hY2Nlc3MgPT0gbG9vcC0+Y2FwdC0+YWNjZXNzICYmCisJICAgIGxvb3AtPnBsYXktPmZvcm1hdCA9PSBsb29wLT5jYXB0LT5mb3JtYXQgJiYKKwkgICAgbG9vcC0+cGxheS0+cmF0ZSA9PSBsb29wLT5jYXB0LT5yYXRlICYmCisJICAgIGxvb3AtPnBsYXktPmNoYW5uZWxzID09IGxvb3AtPnBsYXktPmNoYW5uZWxzICYmCisJICAgIGxvb3AtPnN5bmMgIT0gU1lOQ19UWVBFX1NBTVBMRVJBVEUpIHsKKwkJaWYgKHZlcmJvc2UgPiAxKQorCQkJc25kX291dHB1dF9wcmludGYobG9vcC0+b3V0cHV0LCAic2hhcmVkIGJ1ZmZlciEhIVxuIik7CisJCWlmICgoZXJyID0gaW5pdF9oYW5kbGUobG9vcC0+cGxheSwgMSkpIDwgMCkKKwkJCWdvdG8gX19lcnJvcjsKKwkJaWYgKChlcnIgPSBpbml0X2hhbmRsZShsb29wLT5jYXB0LCAwKSkgPCAwKQorCQkJZ290byBfX2Vycm9yOworCQlpZiAobG9vcC0+cGxheS0+YnVmX3NpemUgPCBsb29wLT5jYXB0LT5idWZfc2l6ZSkgeworCQkJY2hhciAqbmJ1ZiA9IHJlYWxsb2MobG9vcC0+cGxheS0+YnVmLAorCQkJCQkgICAgIGxvb3AtPmNhcHQtPmJ1Zl9zaXplICoKKwkJCQkJICAgICAgIGxvb3AtPmNhcHQtPmZyYW1lX3NpemUpOworCQkJaWYgKG5idWYgPT0gTlVMTCkgeworCQkJCWVyciA9IC1FTk9NRU07CisJCQkJZ290byBfX2Vycm9yOworCQkJfQorCQkJbG9vcC0+cGxheS0+YnVmID0gbmJ1ZjsKKwkJCWxvb3AtPnBsYXktPmJ1Zl9zaXplID0gbG9vcC0+Y2FwdC0+YnVmX3NpemU7CisJCX0gZWxzZSBpZiAobG9vcC0+Y2FwdC0+YnVmX3NpemUgPCBsb29wLT5wbGF5LT5idWZfc2l6ZSkgeworCQkJY2hhciAqbmJ1ZiA9IHJlYWxsb2MobG9vcC0+Y2FwdC0+YnVmLAorCQkJCQkgICAgIGxvb3AtPnBsYXktPmJ1Zl9zaXplICoKKwkJCQkJICAgICAgIGxvb3AtPnBsYXktPmZyYW1lX3NpemUpOworCQkJaWYgKG5idWYgPT0gTlVMTCkgeworCQkJCWVyciA9IC1FTk9NRU07CisJCQkJZ290byBfX2Vycm9yOworCQkJfQorCQkJbG9vcC0+Y2FwdC0+YnVmID0gbmJ1ZjsKKwkJCWxvb3AtPmNhcHQtPmJ1Zl9zaXplID0gbG9vcC0+cGxheS0+YnVmX3NpemU7CisJCX0KKwkJbG9vcC0+Y2FwdC0+YnVmID0gbG9vcC0+cGxheS0+YnVmOworCX0gZWxzZSB7CisJCWlmICgoZXJyID0gaW5pdF9oYW5kbGUobG9vcC0+cGxheSwgMSkpIDwgMCkKKwkJCWdvdG8gX19lcnJvcjsKKwkJaWYgKChlcnIgPSBpbml0X2hhbmRsZShsb29wLT5jYXB0LCAxKSkgPCAwKQorCQkJZ290byBfX2Vycm9yOworCQlpZiAobG9vcC0+cGxheS0+cmF0ZV9yZXEgIT0gbG9vcC0+cGxheS0+cmF0ZSB8fAorICAgICAgICAgICAgICAgICAgICBsb29wLT5jYXB0LT5yYXRlX3JlcSAhPSBsb29wLT5jYXB0LT5yYXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdDEsIGZvcm1hdDI7CisJCQlsb29wLT51c2Vfc2FtcGxlcmF0ZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQxID0gbG9vcC0+cGxheS0+Zm9ybWF0OworICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0MiA9IGxvb3AtPmNhcHQtPmZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpeF9mb3JtYXQobG9vcCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9vcC0+cGxheS0+Zm9ybWF0ICE9IGZvcm1hdDEgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLT5jYXB0LT5mb3JtYXQgIT0gZm9ybWF0MikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY21qb2Jfc3RvcChsb29wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBfX2FnYWluOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwl9CisjaWZkZWYgVVNFX1NBTVBMRVJBVEUKKwlpZiAobG9vcC0+c3luYyA9PSBTWU5DX1RZUEVfU0FNUExFUkFURSkKKwkJbG9vcC0+dXNlX3NhbXBsZXJhdGUgPSAxOworCWlmIChsb29wLT51c2Vfc2FtcGxlcmF0ZSAmJiAhbG9vcC0+c3JjX2VuYWJsZSkgeworCQlsb2dpdChMT0dfQ1JJVCwgInNhbXBsZXJhdGUgY29udmVyc2lvbiByZXF1aXJlZCBidXQgZGlzYWJsZWRcbiIpOworCQlsb29wLT51c2Vfc2FtcGxlcmF0ZSA9IDA7CisJCWVyciA9IC1FSU87CisJCWdvdG8gX19lcnJvcjsJCQorCX0KKwlpZiAobG9vcC0+dXNlX3NhbXBsZXJhdGUpIHsKKwkJaWYgKChsb29wLT5jYXB0LT5mb3JtYXQgIT0gU05EX1BDTV9GT1JNQVRfUzE2IHx8CisJCSAgICBsb29wLT5wbGF5LT5mb3JtYXQgIT0gU05EX1BDTV9GT1JNQVRfUzE2KSAmJgorCQkgICAgKGxvb3AtPmNhcHQtPmZvcm1hdCAhPSBTTkRfUENNX0ZPUk1BVF9TMzIgfHwKKwkJICAgICBsb29wLT5wbGF5LT5mb3JtYXQgIT0gU05EX1BDTV9GT1JNQVRfUzMyKSkgeworCQkJbG9naXQoTE9HX0NSSVQsICJzYW1wbGVyYXRlIGNvbnZlcnNpb24gc3VwcG9ydHMgb25seSAlcyBvciAlcyBmb3JtYXRzIChwbGF5PSVzLCBjYXB0PSVzKVxuIiwgc25kX3BjbV9mb3JtYXRfbmFtZShTTkRfUENNX0ZPUk1BVF9TMTYpLCBzbmRfcGNtX2Zvcm1hdF9uYW1lKFNORF9QQ01fRk9STUFUX1MzMiksIHNuZF9wY21fZm9ybWF0X25hbWUobG9vcC0+cGxheS0+Zm9ybWF0KSwgc25kX3BjbV9mb3JtYXRfbmFtZShsb29wLT5jYXB0LT5mb3JtYXQpKTsKKwkJCWxvb3AtPnVzZV9zYW1wbGVyYXRlID0gMDsKKwkJCWVyciA9IC1FSU87CisJCQlnb3RvIF9fZXJyb3I7CQkKKwkJfQorCQlsb29wLT5zcmNfc3RhdGUgPSBzcmNfbmV3KGxvb3AtPnNyY19jb252ZXJ0ZXJfdHlwZSwKKwkJCQkJICBsb29wLT5wbGF5LT5jaGFubmVscywgJmVycik7CisJCWxvb3AtPnNyY19kYXRhLmRhdGFfaW4gPSBjYWxsb2MoMSwgc2l6ZW9mKGZsb2F0KSpsb29wLT5jYXB0LT5jaGFubmVscypsb29wLT5jYXB0LT5idWZfc2l6ZSk7CisJCWlmIChsb29wLT5zcmNfZGF0YS5kYXRhX2luID09IE5VTEwpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIF9fZXJyb3I7CisJCX0KKwkJbG9vcC0+c3JjX2RhdGEuZGF0YV9vdXQgPSAgY2FsbG9jKDEsIHNpemVvZihmbG9hdCkqbG9vcC0+cGxheS0+Y2hhbm5lbHMqbG9vcC0+cGxheS0+YnVmX3NpemUpOworCQlpZiAobG9vcC0+c3JjX2RhdGEuZGF0YV9vdXQgPT0gTlVMTCkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gX19lcnJvcjsKKwkJfQorCQlsb29wLT5zcmNfZGF0YS5zcmNfcmF0aW8gPSAoZG91YmxlKWxvb3AtPnBsYXktPnJhdGUgLworCQkJCQkgICAoZG91YmxlKWxvb3AtPmNhcHQtPnJhdGU7CisJCWxvb3AtPnNyY19kYXRhLmVuZF9vZl9pbnB1dCA9IDA7CisJCWxvb3AtPnNyY19vdXRfZnJhbWVzID0gMDsKKwl9IGVsc2UgeworCQlsb29wLT5zcmNfc3RhdGUgPSBOVUxMOworCX0KKyNlbHNlCisJaWYgKGxvb3AtPnN5bmMgPT0gU1lOQ19UWVBFX1NBTVBMRVJBVEUgfHwgbG9vcC0+dXNlX3NhbXBsZXJhdGUpIHsKKwkJbG9naXQoTE9HX0NSSVQsICJhbHNhbG9vcCBpcyBjb21waWxlZCB3aXRob3V0IGxpYnNhbXBsZXJhdGUgc3VwcG9ydFxuIik7CisJCWVyciA9IC1FSU87CisJCWdvdG8gX19lcnJvcjsKKwl9CisjZW5kaWYKKwlpZiAodmVyYm9zZSkgeworCQlzbmRfb3V0cHV0X3ByaW50Zihsb29wLT5vdXRwdXQsICIlcyBzeW5jIHR5cGU6ICVzIiwgbG9vcC0+aWQsIHN5bmNfdHlwZXNbbG9vcC0+c3luY10pOworI2lmZGVmIFVTRV9TQU1QTEVSQVRFCisJCWlmIChsb29wLT5zeW5jID09IFNZTkNfVFlQRV9TQU1QTEVSQVRFKQorCQkJc25kX291dHB1dF9wcmludGYobG9vcC0+b3V0cHV0LCAiICglcykiLCBzcmNfdHlwZXNbbG9vcC0+c3JjX2NvbnZlcnRlcl90eXBlXSk7CisjZW5kaWYKKwkJc25kX291dHB1dF9wcmludGYobG9vcC0+b3V0cHV0LCAiXG4iKTsKKwl9CisJbGhhbmRsZV9zdGFydChsb29wLT5wbGF5KTsKKwlsaGFuZGxlX3N0YXJ0KGxvb3AtPmNhcHQpOworCWlmICgoZXJyID0gc25kX3BjbV9mb3JtYXRfc2V0X3NpbGVuY2UobG9vcC0+cGxheS0+Zm9ybWF0LAorCQkJCQkgICAgICBsb29wLT5wbGF5LT5idWYsCisJCQkJCSAgICAgIGxvb3AtPnBsYXktPmJ1Zl9zaXplICogbG9vcC0+cGxheS0+Y2hhbm5lbHMpKSA8IDApIHsKKwkJbG9naXQoTE9HX0NSSVQsICIlczogc2lsZW5jZSBlcnJvclxuIiwgbG9vcC0+aWQpOworCQlnb3RvIF9fZXJyb3I7CisJfQorCWlmICh2ZXJib3NlID4gNCkKKwkJc25kX291dHB1dF9wcmludGYobG9vcC0+b3V0cHV0LCAiJXM6IGNhcHQtPmJ1ZmZlcl9zaXplID0gJWxpLCBwbGF5LT5idWZmZXJfc2l6ZSA9ICVsaVxuIiwgbG9vcC0+aWQsIGxvb3AtPmNhcHQtPmJ1Zl9zaXplLCBsb29wLT5wbGF5LT5idWZfc2l6ZSk7CisJbG9vcC0+cGl0Y2ggPSAxLjA7CisJdXBkYXRlX3BpdGNoKGxvb3ApOworCWxvb3AtPnBpdGNoX2RlbHRhID0gMS4wIC8gKChkb3VibGUpbG9vcC0+Y2FwdC0+cmF0ZSAqIDQpOworCWxvb3AtPnRvdGFsX3F1ZXVlZF9jb3VudCA9IDA7CisJbG9vcC0+cGl0Y2hfZGlmZiA9IDA7CisJY291bnQgPSBnZXRfd2hvbGVfbGF0ZW5jeShsb29wKSAvIGxvb3AtPnBsYXktPnBpdGNoOworCWxvb3AtPnBsYXktPmJ1Zl9jb3VudCA9IGNvdW50OworCWlmIChsb29wLT5wbGF5LT5idWYgPT0gbG9vcC0+Y2FwdC0+YnVmKQorCQlsb29wLT5jYXB0LT5idWZfcG9zID0gY291bnQ7CisJZXJyID0gd3JpdGVpdChsb29wLT5wbGF5KTsKKwlpZiAodmVyYm9zZSA+IDQpCisJCXNuZF9vdXRwdXRfcHJpbnRmKGxvb3AtPm91dHB1dCwgIiVzOiBzaWxlbmNlIHF1ZXVlZCAlaSBzYW1wbGVzXG4iLCBsb29wLT5pZCwgZXJyKTsKKwlpZiAoY291bnQgPiBsb29wLT5wbGF5LT5idWZmZXJfc2l6ZSkKKwkJY291bnQgPSBsb29wLT5wbGF5LT5idWZmZXJfc2l6ZTsKKwlpZiAoZXJyICE9IGNvdW50KSB7CisJCWxvZ2l0KExPR19DUklULCAiJXM6IGluaXRpYWwgcGxheWJhY2sgZmlsbCBlcnJvciAoJWkvJWkvJWkpXG4iLCBsb29wLT5pZCwgZXJyLCAoaW50KWNvdW50LCBsb29wLT5wbGF5LT5idWZmZXJfc2l6ZSk7CisJCWVyciA9IC1FSU87CisJCWdvdG8gX19lcnJvcjsKKwl9CisJbG9vcC0+cnVubmluZyA9IDE7CisJbG9vcC0+c3RvcF9wZW5kaW5nID0gMDsKKwlpZiAobG9vcC0+eHJ1bikgeworCQlnZXRjdXJ0aW1lc3RhbXAoJmxvb3AtPnhydW5fbGFzdF91cGRhdGUpOworCQlsb29wLT54cnVuX2xhc3RfcGRlbGF5ID0gWFJVTl9QUk9GSUxFX1VOS05PV047CisJCWxvb3AtPnhydW5fbGFzdF9jZGVsYXkgPSBYUlVOX1BST0ZJTEVfVU5LTk9XTjsKKwkJbG9vcC0+eHJ1bl9tYXhfcHJvY3RpbWUgPSAwOworCX0KKwlpZiAoKGVyciA9IHNuZF9wY21fc3RhcnQobG9vcC0+Y2FwdC0+aGFuZGxlKSkgPCAwKSB7CisJCWxvZ2l0KExPR19DUklULCAicGNtIHN0YXJ0ICVzIGVycm9yOiAlc1xuIiwgbG9vcC0+Y2FwdC0+aWQsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJZ290byBfX2Vycm9yOworCX0KKwlpZiAoIWxvb3AtPmxpbmtlZCkgeworCQlpZiAoKGVyciA9IHNuZF9wY21fc3RhcnQobG9vcC0+cGxheS0+aGFuZGxlKSkgPCAwKSB7CisJCQlsb2dpdChMT0dfQ1JJVCwgInBjbSBzdGFydCAlcyBlcnJvcjogJXNcbiIsIGxvb3AtPnBsYXktPmlkLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQlnb3RvIF9fZXJyb3I7CisJCX0KKwl9CisJcmV0dXJuIDA7CisgICAgICBfX2Vycm9yOgorCXBjbWpvYl9zdG9wKGxvb3ApOworCXJldHVybiBlcnI7Cit9CisKK2ludCBwY21qb2Jfc3RvcChzdHJ1Y3QgbG9vcGJhY2sgKmxvb3ApCit7CisJaW50IGVycjsKKworCWlmIChsb29wLT5ydW5uaW5nKSB7CisJCWlmICgoZXJyID0gc25kX3BjbV9kcm9wKGxvb3AtPmNhcHQtPmhhbmRsZSkpIDwgMCkKKwkJCWxvZ2l0KExPR19XQVJOSU5HLCAicGNtIGRyb3AgJXMgZXJyb3I6ICVzXG4iLCBsb29wLT5jYXB0LT5pZCwgc25kX3N0cmVycm9yKGVycikpOworCQlpZiAoKGVyciA9IHNuZF9wY21fZHJvcChsb29wLT5wbGF5LT5oYW5kbGUpKSA8IDApCisJCQlsb2dpdChMT0dfV0FSTklORywgInBjbSBkcm9wICVzIGVycm9yOiAlc1xuIiwgbG9vcC0+cGxheS0+aWQsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJaWYgKChlcnIgPSBzbmRfcGNtX2h3X2ZyZWUobG9vcC0+Y2FwdC0+aGFuZGxlKSkgPCAwKQorCQkJbG9naXQoTE9HX1dBUk5JTkcsICJwY20gaHdfZnJlZSAlcyBlcnJvcjogJXNcbiIsIGxvb3AtPmNhcHQtPmlkLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCWlmICgoZXJyID0gc25kX3BjbV9od19mcmVlKGxvb3AtPnBsYXktPmhhbmRsZSkpIDwgMCkKKwkJCWxvZ2l0KExPR19XQVJOSU5HLCAicGNtIGh3X2ZyZWUgJXMgZXJyb3I6ICVzXG4iLCBsb29wLT5wbGF5LT5pZCwgc25kX3N0cmVycm9yKGVycikpOworCQlsb29wLT5ydW5uaW5nID0gMDsKKwl9CisJZnJlZWxvb3AobG9vcCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBwY21qb2JfcG9sbGZkc19pbml0KHN0cnVjdCBsb29wYmFjayAqbG9vcCwgc3RydWN0IHBvbGxmZCAqZmRzKQoreworCWludCBlcnIsIGlkeCA9IDA7CisKKwlpZiAobG9vcC0+cnVubmluZykgeworCQllcnIgPSBzbmRfcGNtX3BvbGxfZGVzY3JpcHRvcnMobG9vcC0+cGxheS0+aGFuZGxlLCBmZHMgKyBpZHgsIGxvb3AtPnBsYXktPnBvbGxmZF9jb3VudCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJaWR4ICs9IGxvb3AtPnBsYXktPnBvbGxmZF9jb3VudDsKKwkJZXJyID0gc25kX3BjbV9wb2xsX2Rlc2NyaXB0b3JzKGxvb3AtPmNhcHQtPmhhbmRsZSwgZmRzICsgaWR4LCBsb29wLT5jYXB0LT5wb2xsZmRfY291bnQpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWlkeCArPSBsb29wLT5jYXB0LT5wb2xsZmRfY291bnQ7CisJfQorCWlmIChsb29wLT5wbGF5LT5jdGxfcG9sbGZkX2NvdW50ID4gMCAmJgorCSAgICAobG9vcC0+c2xhdmUgPT0gU0xBVkVfVFlQRV9PTiB8fCBsb29wLT5jb250cm9scykpIHsKKwkJZXJyID0gc25kX2N0bF9wb2xsX2Rlc2NyaXB0b3JzKGxvb3AtPnBsYXktPmN0bCwgZmRzICsgaWR4LCBsb29wLT5wbGF5LT5jdGxfcG9sbGZkX2NvdW50KTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlpZHggKz0gbG9vcC0+cGxheS0+Y3RsX3BvbGxmZF9jb3VudDsKKwl9CisJaWYgKGxvb3AtPmNhcHQtPmN0bF9wb2xsZmRfY291bnQgPiAwICYmCisJICAgIChsb29wLT5zbGF2ZSA9PSBTTEFWRV9UWVBFX09OIHx8IGxvb3AtPmNvbnRyb2xzKSkgeworCQllcnIgPSBzbmRfY3RsX3BvbGxfZGVzY3JpcHRvcnMobG9vcC0+Y2FwdC0+Y3RsLCBmZHMgKyBpZHgsIGxvb3AtPmNhcHQtPmN0bF9wb2xsZmRfY291bnQpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWlkeCArPSBsb29wLT5jYXB0LT5jdGxfcG9sbGZkX2NvdW50OworCX0KKwlsb29wLT5hY3RpdmVfcG9sbGZkX2NvdW50ID0gaWR4OworCXJldHVybiBpZHg7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3NmcmFtZXNfdCBnZXRfcXVldWVkX3BsYXliYWNrX3NhbXBsZXMoc3RydWN0IGxvb3BiYWNrICpsb29wKQoreworCXNuZF9wY21fc2ZyYW1lc190IGRlbGF5OworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHNuZF9wY21fZGVsYXkobG9vcC0+cGxheS0+aGFuZGxlLCAmZGVsYXkpKSA8IDApCisJCXJldHVybiAwOworCWxvb3AtPnBsYXktPmxhc3RfZGVsYXkgPSBkZWxheTsKKwlkZWxheSArPSBsb29wLT5wbGF5LT5idWZfY291bnQ7CisjaWZkZWYgVVNFX1NBTVBMRVJBVEUKKwlkZWxheSArPSBsb29wLT5zcmNfb3V0X2ZyYW1lczsKKyNlbmRpZgorCXJldHVybiBkZWxheTsKK30KKworc3RhdGljIHNuZF9wY21fc2ZyYW1lc190IGdldF9xdWV1ZWRfY2FwdHVyZV9zYW1wbGVzKHN0cnVjdCBsb29wYmFjayAqbG9vcCkKK3sKKwlzbmRfcGNtX3NmcmFtZXNfdCBkZWxheTsKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBzbmRfcGNtX2RlbGF5KGxvb3AtPmNhcHQtPmhhbmRsZSwgJmRlbGF5KSkgPCAwKQorCQlyZXR1cm4gMDsKKwlsb29wLT5jYXB0LT5sYXN0X2RlbGF5ID0gZGVsYXk7CisJZGVsYXkgKz0gbG9vcC0+Y2FwdC0+YnVmX2NvdW50OworCXJldHVybiBkZWxheTsKK30KKworc3RhdGljIGludCBjdGxfZXZlbnRfY2hlY2soc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnZhbCwgc25kX2N0bF9ldmVudF90ICpldikKK3sKKwlzbmRfY3RsX2VsZW1faWRfdCAqaWQxLCAqaWQyOworCXNuZF9jdGxfZWxlbV9pZF9hbGxvY2EoJmlkMSk7CisJc25kX2N0bF9lbGVtX2lkX2FsbG9jYSgmaWQyKTsKKwlzbmRfY3RsX2VsZW1fdmFsdWVfZ2V0X2lkKHZhbCwgaWQxKTsKKwlzbmRfY3RsX2V2ZW50X2VsZW1fZ2V0X2lkKGV2LCBpZDIpOworCWlmIChzbmRfY3RsX2V2ZW50X2VsZW1fZ2V0X21hc2soZXYpID09IFNORF9DVExfRVZFTlRfTUFTS19SRU1PVkUpCisJCXJldHVybiAwOworCWlmICgoc25kX2N0bF9ldmVudF9lbGVtX2dldF9tYXNrKGV2KSAmIFNORF9DVExfRVZFTlRfTUFTS19WQUxVRSkgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGNvbnRyb2xfaWRfbWF0Y2goaWQxLCBpZDIpOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9jdGxfZXZlbnRzKHN0cnVjdCBsb29wYmFja19oYW5kbGUgKmxoYW5kbGUsCisJCQkgICAgIHVuc2lnbmVkIHNob3J0IGV2ZW50cykKK3sKKwlzdHJ1Y3QgbG9vcGJhY2sgKmxvb3AgPSBsaGFuZGxlLT5sb29wYmFjazsKKwlzbmRfY3RsX2V2ZW50X3QgKmV2OworCWludCBlcnIsIHJlc3RhcnQgPSAwOworCisJc25kX2N0bF9ldmVudF9hbGxvY2EoJmV2KTsKKwl3aGlsZSAoKGVyciA9IHNuZF9jdGxfcmVhZChsaGFuZGxlLT5jdGwsIGV2KSkgIT0gMCAmJiBlcnIgIT0gLUVBR0FJTikgeworCQlpZiAoZXJyIDwgMCkKKwkJCWJyZWFrOworCQlpZiAoc25kX2N0bF9ldmVudF9nZXRfdHlwZShldikgIT0gU05EX0NUTF9FVkVOVF9FTEVNKQorCQkJY29udGludWU7CisJCWlmIChsaGFuZGxlID09IGxvb3AtPnBsYXkpCisJCQlnb3RvIF9fY3RsX2NoZWNrOworCQlpZiAodmVyYm9zZSA+IDYpCisJCQlzbmRfb3V0cHV0X3ByaW50Zihsb29wLT5vdXRwdXQsICIlczogY3RsIGV2ZW50ISEhISAlc1xuIiwgbGhhbmRsZS0+aWQsIHNuZF9jdGxfZXZlbnRfZWxlbV9nZXRfbmFtZShldikpOworCQlpZiAoY3RsX2V2ZW50X2NoZWNrKGxoYW5kbGUtPmN0bF9hY3RpdmUsIGV2KSkgeworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoY3RsX2V2ZW50X2NoZWNrKGxoYW5kbGUtPmN0bF9mb3JtYXQsIGV2KSkgeworCQkJZXJyID0gZ2V0X2Zvcm1hdChsaGFuZGxlKTsKKwkJCWlmIChsaGFuZGxlLT5mb3JtYXQgIT0gZXJyKQorCQkJCXJlc3RhcnQgPSAxOworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoY3RsX2V2ZW50X2NoZWNrKGxoYW5kbGUtPmN0bF9yYXRlLCBldikpIHsKKwkJCWVyciA9IGdldF9yYXRlKGxoYW5kbGUpOworCQkJaWYgKGxoYW5kbGUtPnJhdGUgIT0gZXJyKQorCQkJCXJlc3RhcnQgPSAxOworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoY3RsX2V2ZW50X2NoZWNrKGxoYW5kbGUtPmN0bF9jaGFubmVscywgZXYpKSB7CisJCQllcnIgPSBnZXRfY2hhbm5lbHMobGhhbmRsZSk7CisJCQlpZiAobGhhbmRsZS0+Y2hhbm5lbHMgIT0gZXJyKQorCQkJCXJlc3RhcnQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkgICAgICBfX2N0bF9jaGVjazoKKwkJY29udHJvbF9ldmVudChsaGFuZGxlLCBldik7CisJfQorCWVyciA9IGdldF9hY3RpdmUobGhhbmRsZSk7CisJaWYgKHZlcmJvc2UgPiA3KQorCQlzbmRfb3V0cHV0X3ByaW50Zihsb29wLT5vdXRwdXQsICIlczogY3RsIGV2ZW50IGFjdGl2ZSAlaVxuIiwgbGhhbmRsZS0+aWQsIGVycik7CisJaWYgKCFlcnIpIHsKKwkJaWYgKGxoYW5kbGUtPmxvb3BiYWNrLT5ydW5uaW5nKSB7CisJCQlsb29wLT5zdG9wX3BlbmRpbmcgPSAxOworCQkJbG9vcC0+c3RvcF9jb3VudCA9IDA7CisJCX0KKwl9IGVsc2UgeworCQlsb29wLT5zdG9wX3BlbmRpbmcgPSAwOworCQlpZiAobG9vcC0+cnVubmluZyA9PSAwKQorCQkJcmVzdGFydCA9IDE7CisJfQorCWlmIChyZXN0YXJ0KSB7CisJCXBjbWpvYl9zdG9wKGxvb3ApOworCQllcnIgPSBwY21qb2Jfc3RhcnQobG9vcCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDE7Cit9CisKK2ludCBwY21qb2JfcG9sbGZkc19oYW5kbGUoc3RydWN0IGxvb3BiYWNrICpsb29wLCBzdHJ1Y3QgcG9sbGZkICpmZHMpCit7CisJc3RydWN0IGxvb3BiYWNrX2hhbmRsZSAqcGxheSA9IGxvb3AtPnBsYXk7CisJc3RydWN0IGxvb3BiYWNrX2hhbmRsZSAqY2FwdCA9IGxvb3AtPmNhcHQ7CisJdW5zaWduZWQgc2hvcnQgcHJldmVudHMsIGNyZXZlbnRzLCBldmVudHM7CisJc25kX3BjbV91ZnJhbWVzX3QgY2NvdW50LCBwY291bnQ7CisJaW50IGVyciwgbG9vcGNvdW50ID0gMTAsIGlkeDsKKworCWlmICh2ZXJib3NlID4gMTEpCisJCXNuZF9vdXRwdXRfcHJpbnRmKGxvb3AtPm91dHB1dCwgIiVzOiBwb2xsZmRzIGhhbmRsZVxuIiwgbG9vcC0+aWQpOworCWlmICh2ZXJib3NlID4gMTMgfHwgbG9vcC0+eHJ1bikKKwkJZ2V0Y3VydGltZXN0YW1wKCZsb29wLT50c3RhbXBfc3RhcnQpOworCWlmICh2ZXJib3NlID4gMTIpIHsKKwkJc25kX3BjbV9zZnJhbWVzX3QgcGRlbGF5LCBjZGVsYXk7CisJCWlmICgoZXJyID0gc25kX3BjbV9kZWxheShwbGF5LT5oYW5kbGUsICZwZGVsYXkpKSA8IDApCisJCQlzbmRfb3V0cHV0X3ByaW50Zihsb29wLT5vdXRwdXQsICIlczogZGVsYXkgZXJyb3I6ICVzIC8gJWxpIC8gJWxpXG4iLCBwbGF5LT5pZCwgc25kX3N0cmVycm9yKGVyciksIHBsYXktPmJ1Zl9zaXplLCBwbGF5LT5idWZfY291bnQpOworCQllbHNlCisJCQlzbmRfb3V0cHV0X3ByaW50Zihsb29wLT5vdXRwdXQsICIlczogZGVsYXkgJWxpIC8gJWxpIC8gJWxpXG4iLCBwbGF5LT5pZCwgcGRlbGF5LCBwbGF5LT5idWZfc2l6ZSwgcGxheS0+YnVmX2NvdW50KTsKKwkJaWYgKChlcnIgPSBzbmRfcGNtX2RlbGF5KGNhcHQtPmhhbmRsZSwgJmNkZWxheSkpIDwgMCkKKwkJCXNuZF9vdXRwdXRfcHJpbnRmKGxvb3AtPm91dHB1dCwgIiVzOiBkZWxheSBlcnJvcjogJXMgLyAlbGkgLyAlbGlcbiIsIGNhcHQtPmlkLCBzbmRfc3RyZXJyb3IoZXJyKSwgY2FwdC0+YnVmX3NpemUsIGNhcHQtPmJ1Zl9jb3VudCk7CisJCWVsc2UKKwkJCXNuZF9vdXRwdXRfcHJpbnRmKGxvb3AtPm91dHB1dCwgIiVzOiBkZWxheSAlbGkgLyAlbGkgLyAlbGlcbiIsIGNhcHQtPmlkLCBjZGVsYXksIGNhcHQtPmJ1Zl9zaXplLCBjYXB0LT5idWZfY291bnQpOworCX0KKwlpZHggPSAwOworCWlmIChsb29wLT5ydW5uaW5nKSB7CisJCWVyciA9IHNuZF9wY21fcG9sbF9kZXNjcmlwdG9yc19yZXZlbnRzKHBsYXktPmhhbmRsZSwgZmRzLAorCQkJCQkJICAgICAgIHBsYXktPnBvbGxmZF9jb3VudCwKKwkJCQkJCSAgICAgICAmcHJldmVudHMpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWlkeCArPSBwbGF5LT5wb2xsZmRfY291bnQ7CisJCWVyciA9IHNuZF9wY21fcG9sbF9kZXNjcmlwdG9yc19yZXZlbnRzKGNhcHQtPmhhbmRsZSwgZmRzICsgaWR4LAorCQkJCQkJICAgICAgIGNhcHQtPnBvbGxmZF9jb3VudCwKKwkJCQkJCSAgICAgICAmY3JldmVudHMpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWlkeCArPSBjYXB0LT5wb2xsZmRfY291bnQ7CisJCWlmIChsb29wLT54cnVuKSB7CisJCQlpZiAocHJldmVudHMgfHwgY3JldmVudHMpIHsKKwkJCQlsb29wLT54cnVuX2xhc3Rfd2FrZSA9IGxvb3AtPnhydW5fbGFzdF93YWtlMDsKKwkJCQlsb29wLT54cnVuX2xhc3Rfd2FrZTAgPSBsb29wLT50c3RhbXBfc3RhcnQ7CisJCQl9CisJCQlsb29wLT54cnVuX2xhc3RfY2hlY2sgPSBsb29wLT54cnVuX2xhc3RfY2hlY2swOworCQkJbG9vcC0+eHJ1bl9sYXN0X2NoZWNrMCA9IGxvb3AtPnRzdGFtcF9zdGFydDsKKwkJfQorCX0gZWxzZSB7CisJCXByZXZlbnRzID0gY3JldmVudHMgPSAwOworCX0KKwlpZiAocGxheS0+Y3RsX3BvbGxmZF9jb3VudCA+IDAgJiYKKwkgICAgKGxvb3AtPnNsYXZlID09IFNMQVZFX1RZUEVfT04gfHwgbG9vcC0+Y29udHJvbHMpKSB7CisJCWVyciA9IHNuZF9jdGxfcG9sbF9kZXNjcmlwdG9yc19yZXZlbnRzKHBsYXktPmN0bCwgZmRzICsgaWR4LAorCQkJCQkJICAgICAgIHBsYXktPmN0bF9wb2xsZmRfY291bnQsCisJCQkJCQkgICAgICAgJmV2ZW50cyk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKGV2ZW50cykgeworCQkJZXJyID0gaGFuZGxlX2N0bF9ldmVudHMocGxheSwgZXZlbnRzKTsKKwkJCWlmIChlcnIgPT0gMSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwkJaWR4ICs9IHBsYXktPmN0bF9wb2xsZmRfY291bnQ7CisJfQorCWlmIChjYXB0LT5jdGxfcG9sbGZkX2NvdW50ID4gMCAmJgorCSAgICAobG9vcC0+c2xhdmUgPT0gU0xBVkVfVFlQRV9PTiB8fCBsb29wLT5jb250cm9scykpIHsKKwkJZXJyID0gc25kX2N0bF9wb2xsX2Rlc2NyaXB0b3JzX3JldmVudHMoY2FwdC0+Y3RsLCBmZHMgKyBpZHgsCisJCQkJCQkgICAgICAgY2FwdC0+Y3RsX3BvbGxmZF9jb3VudCwKKwkJCQkJCSAgICAgICAmZXZlbnRzKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlpZiAoZXZlbnRzKSB7CisJCQllcnIgPSBoYW5kbGVfY3RsX2V2ZW50cyhjYXB0LCBldmVudHMpOworCQkJaWYgKGVyciA9PSAxKQorCQkJCXJldHVybiAwOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCQlpZHggKz0gY2FwdC0+Y3RsX3BvbGxmZF9jb3VudDsKKwl9CisJaWYgKHZlcmJvc2UgPiA5KQorCQlzbmRfb3V0cHV0X3ByaW50Zihsb29wLT5vdXRwdXQsICIlczogcHJldmVudHMgPSAweCV4LCBjcmV2ZW50cyA9IDB4JXhcbiIsIGxvb3AtPmlkLCBwcmV2ZW50cywgY3JldmVudHMpOworCWlmICghbG9vcC0+cnVubmluZykKKwkJZ290byBfX3BjbV9lbmQ7CisJZG8geworCQljY291bnQgPSByZWFkaXQoY2FwdCk7CisJCWJ1Zl9hZGQobG9vcCwgY2NvdW50KTsKKwkJaWYgKGNhcHQtPnhydW5fcGVuZGluZyB8fCBsb29wLT5yZWluaXQpCisJCQlicmVhazsKKwkJLyogd2UgcmVhZCBuZXcgc2FtcGxlcywgaWYgd2UgaGF2ZSBhIHJvb20gaW4gdGhlIHBsYXliYWNrCisJCSAgIGJ1ZmZlciwgZmVlZCB0aGVtIHRoZXJlICovCisJCXBjb3VudCA9IHdyaXRlaXQocGxheSk7CisJCWJ1Zl9yZW1vdmUobG9vcCwgcGNvdW50KTsKKwkJaWYgKHBsYXktPnhydW5fcGVuZGluZyB8fCBsb29wLT5yZWluaXQpCisJCQlicmVhazsKKwkJbG9vcGNvdW50LS07CisJfSB3aGlsZSAoKGNjb3VudCA+IDAgfHwgcGNvdW50ID4gMCkgJiYgbG9vcGNvdW50ID4gMCk7CisJaWYgKHBsYXktPnhydW5fcGVuZGluZyB8fCBjYXB0LT54cnVuX3BlbmRpbmcpIHsKKwkJaWYgKChlcnIgPSB4cnVuX3N5bmMobG9vcCkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCWlmIChsb29wLT5yZWluaXQpIHsKKwkJZXJyID0gcGNtam9iX3N0b3AobG9vcCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJZXJyID0gcGNtam9iX3N0YXJ0KGxvb3ApOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCWlmIChsb29wLT5zeW5jICE9IFNZTkNfVFlQRV9OT05FICYmCisJICAgIHBsYXktPmNvdW50ZXIgPj0gcGxheS0+c3luY19wb2ludCAmJgorCSAgICBjYXB0LT5jb3VudGVyID49IHBsYXktPnN5bmNfcG9pbnQpIHsKKwkJc25kX3BjbV9zZnJhbWVzX3QgZGlmZiwgbGF0ID0gZ2V0X3dob2xlX2xhdGVuY3kobG9vcCk7CisJCWRpZmYgPSAoKGRvdWJsZSkoKChkb3VibGUpcGxheS0+dG90YWxfcXVldWVkICogcGxheS0+cGl0Y2gpICsKKwkJCQkgKChkb3VibGUpY2FwdC0+dG90YWxfcXVldWVkICogY2FwdC0+cGl0Y2gpKSAvCisJCQkoZG91YmxlKWxvb3AtPnRvdGFsX3F1ZXVlZF9jb3VudCkgLSBsYXQ7CisJCS8qIEZJWE1FOiB0aGlzIGFsZ29yaXRobSBtYXkgYmUgc2xpZ2h0bHkgYmV0dGVyICovCisJCWlmICh2ZXJib3NlID4gMykKKwkJCXNuZF9vdXRwdXRfcHJpbnRmKGxvb3AtPm91dHB1dCwgIiVzOiBzeW5jIGRpZmYgJWxpIG9sZCBkaWZmICVsaVxuIiwgbG9vcC0+aWQsIGRpZmYsIGxvb3AtPnBpdGNoX2RpZmYpOworCQlpZiAoZGlmZiA+IDApIHsKKwkJCWlmIChkaWZmID09IGxvb3AtPnBpdGNoX2RpZmYpCisJCQkJbG9vcC0+cGl0Y2ggKz0gbG9vcC0+cGl0Y2hfZGVsdGE7CisJCQllbHNlIGlmIChkaWZmID4gbG9vcC0+cGl0Y2hfZGlmZikKKwkJCQlsb29wLT5waXRjaCArPSBsb29wLT5waXRjaF9kZWx0YSoyOworCQl9IGVsc2UgaWYgKGRpZmYgPCAwKSB7CisJCQlpZiAoZGlmZiA9PSBsb29wLT5waXRjaF9kaWZmKQorCQkJCWxvb3AtPnBpdGNoIC09IGxvb3AtPnBpdGNoX2RlbHRhOworCQkJZWxzZSBpZiAoZGlmZiA8IGxvb3AtPnBpdGNoX2RpZmYpCisJCQkJbG9vcC0+cGl0Y2ggLT0gbG9vcC0+cGl0Y2hfZGVsdGEqMjsKKwkJfQorCQlsb29wLT5waXRjaF9kaWZmID0gZGlmZjsKKwkJaWYgKGxvb3AtPnBpdGNoX2RpZmZfbWluID4gZGlmZikKKwkJCWxvb3AtPnBpdGNoX2RpZmZfbWluID0gZGlmZjsKKwkJaWYgKGxvb3AtPnBpdGNoX2RpZmZfbWF4IDwgZGlmZikKKwkJCWxvb3AtPnBpdGNoX2RpZmZfbWF4ID0gZGlmZjsKKwkJdXBkYXRlX3BpdGNoKGxvb3ApOworCQlwbGF5LT5jb3VudGVyIC09IHBsYXktPnN5bmNfcG9pbnQ7CisJCWNhcHQtPmNvdW50ZXIgLT0gcGxheS0+c3luY19wb2ludDsKKwkJcGxheS0+dG90YWxfcXVldWVkID0gMDsKKwkJY2FwdC0+dG90YWxfcXVldWVkID0gMDsKKwkJbG9vcC0+dG90YWxfcXVldWVkX2NvdW50ID0gMDsKKwl9CisJaWYgKGxvb3AtPnN5bmMgIT0gU1lOQ19UWVBFX05PTkUpIHsKKwkJc25kX3BjbV9zZnJhbWVzX3QgcHF1ZXVlZCwgY3F1ZXVlZDsKKwkJcHF1ZXVlZCA9IGdldF9xdWV1ZWRfcGxheWJhY2tfc2FtcGxlcyhsb29wKTsKKwkJY3F1ZXVlZCA9IGdldF9xdWV1ZWRfY2FwdHVyZV9zYW1wbGVzKGxvb3ApOworCQlpZiAodmVyYm9zZSA+IDQpCisJCQlzbmRfb3V0cHV0X3ByaW50Zihsb29wLT5vdXRwdXQsICIlczogcXVldWVkICVsaS8lbGkgc2FtcGxlc1xuIiwgbG9vcC0+aWQsIHBxdWV1ZWQsIGNxdWV1ZWQpOworCQlpZiAocHF1ZXVlZCA+IDApCisJCQlwbGF5LT50b3RhbF9xdWV1ZWQgKz0gcHF1ZXVlZDsKKwkJaWYgKGNxdWV1ZWQgPiAwKQorCQkJY2FwdC0+dG90YWxfcXVldWVkICs9IGNxdWV1ZWQ7CisJCWlmIChwcXVldWVkID4gMCB8fCBjcXVldWVkID4gMCkKKwkJCWxvb3AtPnRvdGFsX3F1ZXVlZF9jb3VudCArPSAxOworCX0KKwlpZiAodmVyYm9zZSA+IDEyKSB7CisJCXNuZF9wY21fc2ZyYW1lc190IHBkZWxheSwgY2RlbGF5OworCQlpZiAoKGVyciA9IHNuZF9wY21fZGVsYXkocGxheS0+aGFuZGxlLCAmcGRlbGF5KSkgPCAwKQorCQkJc25kX291dHB1dF9wcmludGYobG9vcC0+b3V0cHV0LCAiJXM6IGVuZCBkZWxheSBlcnJvcjogJXMgLyAlbGkgLyAlbGlcbiIsIHBsYXktPmlkLCBzbmRfc3RyZXJyb3IoZXJyKSwgcGxheS0+YnVmX3NpemUsIHBsYXktPmJ1Zl9jb3VudCk7CisJCWVsc2UKKwkJCXNuZF9vdXRwdXRfcHJpbnRmKGxvb3AtPm91dHB1dCwgIiVzOiBlbmQgZGVsYXkgJWxpIC8gJWxpIC8gJWxpXG4iLCBwbGF5LT5pZCwgcGRlbGF5LCBwbGF5LT5idWZfc2l6ZSwgcGxheS0+YnVmX2NvdW50KTsKKwkJaWYgKChlcnIgPSBzbmRfcGNtX2RlbGF5KGNhcHQtPmhhbmRsZSwgJmNkZWxheSkpIDwgMCkKKwkJCXNuZF9vdXRwdXRfcHJpbnRmKGxvb3AtPm91dHB1dCwgIiVzOiBlbmQgZGVsYXkgZXJyb3I6ICVzIC8gJWxpIC8gJWxpXG4iLCBjYXB0LT5pZCwgc25kX3N0cmVycm9yKGVyciksIGNhcHQtPmJ1Zl9zaXplLCBjYXB0LT5idWZfY291bnQpOworCQllbHNlCisJCQlzbmRfb3V0cHV0X3ByaW50Zihsb29wLT5vdXRwdXQsICIlczogZW5kIGRlbGF5ICVsaSAvICVsaSAvICVsaVxuIiwgY2FwdC0+aWQsIGNkZWxheSwgY2FwdC0+YnVmX3NpemUsIGNhcHQtPmJ1Zl9jb3VudCk7CisJfQorICAgICAgX19wY21fZW5kOgorCWlmICh2ZXJib3NlID4gMTMgfHwgbG9vcC0+eHJ1bikgeworCQlsb25nIGRpZmY7CisJCWdldGN1cnRpbWVzdGFtcCgmbG9vcC0+dHN0YW1wX2VuZCk7CisJCWRpZmYgPSB0aW1lZGlmZihsb29wLT50c3RhbXBfZW5kLCBsb29wLT50c3RhbXBfc3RhcnQpOworCQlpZiAodmVyYm9zZSA+IDEzKQorCQkJc25kX291dHB1dF9wcmludGYobG9vcC0+b3V0cHV0LCAiJXM6IHByb2Nlc3NpbmcgdGltZSAlbGl1c1xuIiwgbG9vcC0+aWQsIGRpZmYpOworCQlpZiAobG9vcC0+eHJ1biAmJiBsb29wLT54cnVuX21heF9wcm9jdGltZSA8IGRpZmYpCisJCQlsb29wLT54cnVuX21heF9wcm9jdGltZSA9IGRpZmY7CisJfQorCXJldHVybiAwOworfQorCisjZGVmaW5lIE9VVChhcmdzLi4uKSBcCisJc25kX291dHB1dF9wcmludGYobG9vcC0+c3RhdGUsICMjYXJncykKKworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBzdGF0ZV9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisKK3N0YXRpYyB2b2lkIHNob3dfaGFuZGxlKHN0cnVjdCBsb29wYmFja19oYW5kbGUgKmxoYW5kbGUsIGNvbnN0IGNoYXIgKmlkKQoreworCXN0cnVjdCBsb29wYmFjayAqbG9vcCA9IGxoYW5kbGUtPmxvb3BiYWNrOworCisJT1VUKCIgICVzOiAlczpcbiIsIGlkLCBsaGFuZGxlLT5pZCk7CisJT1VUKCIgICAgZGV2aWNlID0gJyVzJywgY3RsZGV2ICclcydcbiIsIGxoYW5kbGUtPmRldmljZSwgbGhhbmRsZS0+Y3RsZGV2KTsKKwlPVVQoIiAgICBjYXJkX251bWJlciA9ICVpXG4iLCBsaGFuZGxlLT5jYXJkX251bWJlcik7CisJaWYgKCFsb29wLT5ydW5uaW5nKQorCQlyZXR1cm47CisJT1VUKCIgICAgYWNjZXNzID0gJXMsIGZvcm1hdCA9ICVzLCByYXRlID0gJXUsIGNoYW5uZWxzID0gJXVcbiIsIHNuZF9wY21fYWNjZXNzX25hbWUobGhhbmRsZS0+YWNjZXNzKSwgc25kX3BjbV9mb3JtYXRfbmFtZShsaGFuZGxlLT5mb3JtYXQpLCBsaGFuZGxlLT5yYXRlLCBsaGFuZGxlLT5jaGFubmVscyk7CisJT1VUKCIgICAgYnVmZmVyX3NpemUgPSAldSwgcGVyaW9kX3NpemUgPSAldSwgYXZhaWxfbWluID0gJWxpXG4iLCBsaGFuZGxlLT5idWZmZXJfc2l6ZSwgbGhhbmRsZS0+cGVyaW9kX3NpemUsIGxoYW5kbGUtPmF2YWlsX21pbik7CisJT1VUKCIgICAgeHJ1bl9wZW5kaW5nID0gJWlcbiIsIGxoYW5kbGUtPnhydW5fcGVuZGluZyk7CisJT1VUKCIgICAgYnVmX3NpemUgPSAlbGksIGJ1Zl9wb3MgPSAlbGksIGJ1Zl9jb3VudCA9ICVsaSwgYnVmX292ZXIgPSAlbGlcbiIsIGxoYW5kbGUtPmJ1Zl9zaXplLCBsaGFuZGxlLT5idWZfcG9zLCBsaGFuZGxlLT5idWZfY291bnQsIGxoYW5kbGUtPmJ1Zl9vdmVyKTsKKwlPVVQoIiAgICBwaXRjaCA9ICUuOGZcbiIsIGxoYW5kbGUtPnBpdGNoKTsKK30KKwordm9pZCBwY21qb2Jfc3RhdGUoc3RydWN0IGxvb3BiYWNrICpsb29wKQoreworCXB0aHJlYWRfdCBzZWxmID0gcHRocmVhZF9zZWxmKCk7CisJcHRocmVhZF9tdXRleF9sb2NrKCZzdGF0ZV9tdXRleCk7CisJT1VUKCJTdGF0ZSBkdW1wIGZvciB0aHJlYWQgJXAgam9iICVpOiAlczpcbiIsICh2b2lkICopc2VsZiwgbG9vcC0+dGhyZWFkLCBsb29wLT5pZCk7CisJT1VUKCIgIHJ1bm5pbmcgPSAlaVxuIiwgbG9vcC0+cnVubmluZyk7CisJT1VUKCIgIHN5bmMgPSAlaVxuIiwgbG9vcC0+c3luYyk7CisJT1VUKCIgIHNsYXZlID0gJWlcbiIsIGxvb3AtPnNsYXZlKTsKKwlpZiAoIWxvb3AtPnJ1bm5pbmcpCisJCWdvdG8gX19za2lwOworCU9VVCgiICBwb2xsZmRfY291bnQgPSAlaVxuIiwgbG9vcC0+cG9sbGZkX2NvdW50KTsKKwlPVVQoIiAgcGl0Y2ggPSAlLjhmLCBkZWx0YSA9ICUuOGYsIGRpZmYgPSAlbGksIG1pbiA9ICVsaSwgbWF4ID0gJWxpXG4iLCBsb29wLT5waXRjaCwgbG9vcC0+cGl0Y2hfZGVsdGEsIGxvb3AtPnBpdGNoX2RpZmYsIGxvb3AtPnBpdGNoX2RpZmZfbWluLCBsb29wLT5waXRjaF9kaWZmX21heCk7CisJT1VUKCIgIHVzZV9zYW1wbGVyYXRlID0gJWlcbiIsIGxvb3AtPnVzZV9zYW1wbGVyYXRlKTsKKyAgICAgIF9fc2tpcDoKKwlzaG93X2hhbmRsZShsb29wLT5wbGF5LCAicGxheWJhY2siKTsKKwlzaG93X2hhbmRsZShsb29wLT5jYXB0LCAiY2FwdHVyZSIpOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzdGF0ZV9tdXRleCk7Cit9CmRpZmYgLS1naXQgYS9hbHNhbG9vcC90ZXN0LnNoIGIvYWxzYWxvb3AvdGVzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mYWM3MmI5Ci0tLSAvZGV2L251bGwKKysrIGIvYWxzYWxvb3AvdGVzdC5zaApAQCAtMCwwICsxLDk0IEBACisjIS9iaW4vYmFzaAorCisjREJHPSJnZGIgLS1hcmdzICIKKyNEQkc9InN0cmFjZSIKKyNEQkc9InZhbGdyaW5kIC0tbGVhay1jaGVjaz1mdWxsIgorQVJHUz0KK0NGR0ZJTEU9Ii90bXAvYWxzYWxvb3AudGVzdC5jZmciCisKK3Rlc3QxKCkgeworICBlY2hvICJURVNUMSIKKyAgJERCRyAuL2Fsc2Fsb29wIC1DIGh3OjEsMCAtUCBwbHVnaHc6MCwwIFwKKyAgICAtLXRsYXRlbmN5IDUwMDAwIFwKKyAgICAtLW1peGVyICJuYW1lPSdNYXN0ZXIgUGxheWJhY2sgVm9sdW1lJ0BuYW1lPSdNYXN0ZXIgUGxheWJhY2sgVm9sdW1lJyIgXAorICAgIC0tbWl4ZXIgIm5hbWU9J01hc3RlciBQbGF5YmFjayBTd2l0Y2gnQG5hbWU9J01hc3RlciBQbGF5YmFjayBTd2l0Y2gnIiBcCisgICAgLS1taXhlciAibmFtZT0nUENNIFBsYXliYWNrIFZvbHVtZSciIFwKKyAgICAtLW9zc21peGVyICJNYXN0ZXJAVk9MVU1FIiBcCisgICAgLS1vc3NtaXhlciAiUENNQFBDTSIgXAorICAgICRBUkdTCit9CisKK3Rlc3QyKCkgeworICBlY2hvICJURVNUMiIKK2NhdCA+ICRDRkdGSUxFIDw8RU9GCisjIGZpcnN0IGpvYgorLUMgaHc6MSwwLDAgLVAgaHc6MCwwLDAgLS10bGF0ZW5jeSA1MDAwMCAtLXRocmVhZCAxIFwKKyAgICAtLW1peGVyICJuYW1lPSdNYXN0ZXIgUGxheWJhY2sgVm9sdW1lJ0BuYW1lPSdNYXN0ZXIgUGxheWJhY2sgVm9sdW1lJyIgXAorICAgIC0tbWl4ZXIgIm5hbWU9J01hc3RlciBQbGF5YmFjayBTd2l0Y2gnQG5hbWU9J01hc3RlciBQbGF5YmFjayBTd2l0Y2gnIiBcCisgICAgLS1taXhlciAibmFtZT0nUENNIFBsYXliYWNrIFZvbHVtZSciCisjIG5leHQgbGluZSAtIHNlY29uZCBqb2IKKy1DIGh3OjEsMCwxIC1QIGh3OjAsMSwwIC0tdGxhdGVuY3kgNTAwMDAgLS10aHJlYWQgMgorRU9GCisgICREQkcgLi9hbHNhbG9vcCAtZCAtLWNvbmZpZyAkQ0ZHRklMRSAkQVJHUworfQorCit0ZXN0MygpIHsKKyAgZWNobyAiVEVTVDMiCisgIExBVEVOQ1k9MTgwMDAwCitjYXQgPiAkQ0ZHRklMRSA8PEVPRgorLUMgaHc6MSwwLDAgLVAgcGx1ZzpkbWl4OjAgLS10bGF0ZW5jeSAkTEFURU5DWSAtLXRocmVhZCAwIFwKKyAgICAtLW1peGVyICJuYW1lPSdNYXN0ZXIgUGxheWJhY2sgVm9sdW1lJ0BuYW1lPSdNYXN0ZXIgUGxheWJhY2sgVm9sdW1lJyIgXAorICAgIC0tbWl4ZXIgIm5hbWU9J01hc3RlciBQbGF5YmFjayBTd2l0Y2gnQG5hbWU9J01hc3RlciBQbGF5YmFjayBTd2l0Y2gnIiBcCisgICAgLS1taXhlciAibmFtZT0nUENNIFBsYXliYWNrIFZvbHVtZSciIFwKKyAgICAtLW9zc21peGVyICJuYW1lPU1hc3RlckBWT0xVTUUiCistQyBodzoxLDAsMSAtUCBwbHVnOmRtaXg6MCAtLXRsYXRlbmN5ICRMQVRFTkNZIC0tdGhyZWFkIDEKKy1DIGh3OjEsMCwyIC1QIHBsdWc6ZG1peDowIC0tdGxhdGVuY3kgJExBVEVOQ1kgLS10aHJlYWQgMgorLUMgaHc6MSwwLDMgLVAgcGx1ZzpkbWl4OjAgLS10bGF0ZW5jeSAkTEFURU5DWSAtLXRocmVhZCAzCistQyBodzoxLDAsNCAtUCBwbHVnOmRtaXg6MCAtLXRsYXRlbmN5ICRMQVRFTkNZIC0tdGhyZWFkIDQKKy1DIGh3OjEsMCw1IC1QIHBsdWc6ZG1peDowIC0tdGxhdGVuY3kgJExBVEVOQ1kgLS10aHJlYWQgNQorLUMgaHc6MSwwLDYgLVAgcGx1ZzpkbWl4OjAgLS10bGF0ZW5jeSAkTEFURU5DWSAtLXRocmVhZCA2CistQyBodzoxLDAsNyAtUCBwbHVnOmRtaXg6MCAtLXRsYXRlbmN5ICRMQVRFTkNZIC0tdGhyZWFkIDcKK0VPRgorICAkREJHIC4vYWxzYWxvb3AgLS1jb25maWcgJENGR0ZJTEUgJEFSR1MKK30KKwordGVzdDQoKSB7CisgIGVjaG8gIlRFU1Q0IgorICAkREJHIC4vYWxzYWxvb3AgLUMgaHc6MSwwIC1QIHBsdWdodzowLDAgLWEgb2ZmIC1yIDExMDI1IFwKKyAgICAtLXRsYXRlbmN5IDUwMDAwIFwKKyAgICAtLW1peGVyICJuYW1lPSdNYXN0ZXIgUGxheWJhY2sgVm9sdW1lJ0BuYW1lPSdNYXN0ZXIgUGxheWJhY2sgVm9sdW1lJyIgXAorICAgIC0tbWl4ZXIgIm5hbWU9J01hc3RlciBQbGF5YmFjayBTd2l0Y2gnQG5hbWU9J01hc3RlciBQbGF5YmFjayBTd2l0Y2gnIiBcCisgICAgLS1taXhlciAibmFtZT0nUENNIFBsYXliYWNrIFZvbHVtZSciIFwKKyAgICAkQVJHUworfQorCit0ZXN0NSgpIHsKKyAgZWNobyAiVEVTVDUiCitjYXQgPiAkQ0ZHRklMRSA8PEVPRgorLUMgaHc6MSwwLDAgLVAgcGx1Z2h3OjAsMCAtLXRsYXRlbmN5IDUwMDAwIC0tdGhyZWFkIDEgXAorICAgIC0tbWl4ZXIgIm5hbWU9J01hc3RlciBQbGF5YmFjayBWb2x1bWUnQG5hbWU9J01hc3RlciBQbGF5YmFjayBWb2x1bWUnIiBcCisgICAgLS1taXhlciAibmFtZT0nTWFzdGVyIFBsYXliYWNrIFN3aXRjaCdAbmFtZT0nTWFzdGVyIFBsYXliYWNrIFN3aXRjaCciIFwKKyAgICAtLW1peGVyICJuYW1lPSdQQ00gUGxheWJhY2sgVm9sdW1lJyIgXAorICAgIC0tb3NzbWl4ZXIgIm5hbWU9TWFzdGVyQFZPTFVNRSIKKy1DIGh3OjEsMCwxIC1QIHBsdWdodzowLDEgLS10bGF0ZW5jeSA1MDAwMCAtLXRocmVhZCAyCitFT0YKKyAgJERCRyAuL2Fsc2Fsb29wIC0tY29uZmlnICRDRkdGSUxFICRBUkdTCit9CisKK3NpZ3VzcjEoKSB7CisJcGlkPSQocHMgYXggfCBncmVwIGFsc2Fsb29wIHwgZ3JlcCAtdiBncmVwIHwgY29scm0gNyAyNTUpCisJaWYgdGVzdCAtbiAiJHBpZCI7IHRoZW4KKwkJZWNobyAiS2lsbGluZyBhbHNhbG9vcCAkcGlkLi4uIgorCQlraWxsIC1TSUdVU1IxICRwaWQKKwlmaQorfQorCitjYXNlICIkMSIgaW4KK3Rlc3QxKSBzaGlmdDsgQVJHUz0iJEAiOyB0ZXN0MSA7OwordGVzdDIpIHNoaWZ0OyBBUkdTPSIkQCI7IHRlc3QyIDs7Cit0ZXN0Mykgc2hpZnQ7IEFSR1M9IiRAIjsgdGVzdDMgOzsKK3Rlc3Q0KSBzaGlmdDsgQVJHUz0iJEAiOyB0ZXN0NCA7OwordGVzdDUpIHNoaWZ0OyBBUkdTPSIkQCI7IHRlc3Q1IDs7Cit1c3J8c2lnKikgc2lndXNyMSA7OworKikgQVJHUz0iJEAiOyB0ZXN0MSA7OworZXNhYwpkaWZmIC0tZ2l0IGEvYWxzYW1peGVyL01ha2VmaWxlLmFtIGIvYWxzYW1peGVyL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhODIzMjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbHNhbWl4ZXIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyNSBAQAorQU1fQ0ZMQUdTID0gQENVUlNFU19DRkxBR1NAIC1EQ1VSU0VTSU5DPSJAQ1VSU0VTSU5DQCIKK0xEQUREID0gQENVUlNFU0xJQkAKKworYmluX1BST0dSQU1TID0gYWxzYW1peGVyCithbHNhbWl4ZXJfU09VUkNFUyA9IGNhcmRfc2VsZWN0LmMgY2FyZF9zZWxlY3QuaCBcCisJCWNsaS5jIFwKKwkJY29sb3JzLmMgY29sb3JzLmggXAorCQlkZXZpY2VfbmFtZS5jIGRldmljZV9uYW1lLmggXAorCQlkaWUuYyBkaWUuaCBcCisJCW1haW5sb29wLmMgbWFpbmxvb3AuaCBcCisJCW1lbS5jIG1lbS5oIFwKKwkJbWl4ZXJfY29udHJvbHMuYyBtaXhlcl9jb250cm9scy5oIFwKKwkJbWl4ZXJfZGlzcGxheS5jIG1peGVyX2Rpc3BsYXkuaCBcCisJCW1peGVyX3dpZGdldC5jIG1peGVyX3dpZGdldC5oIFwKKwkJcHJvY19maWxlcy5jIHByb2NfZmlsZXMuaCBcCisJCXRleHRib3guYyB0ZXh0Ym94LmggXAorCQl1dGlscy5jIHV0aWxzLmggXAorCQl2b2x1bWVfbWFwcGluZy5jIHZvbHVtZV9tYXBwaW5nLmggXAorCQl3aWRnZXQuYyB3aWRnZXQuaAorbWFuX01BTlMgPSBhbHNhbWl4ZXIuMQorRVhUUkFfRElTVCA9IGFsc2FtaXhlci4xCithbHNhbWl4ZXJfSU5DTFVERVMgPSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorCisjTERGTEFHUyA9IC1zdGF0aWMKKyNDRkxBR1MgKz0gLWcgLVdhbGwKZGlmZiAtLWdpdCBhL2Fsc2FtaXhlci9hbHNhbWl4ZXIuMSBiL2Fsc2FtaXhlci9hbHNhbWl4ZXIuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDg4NDA0Ci0tLSAvZGV2L251bGwKKysrIGIvYWxzYW1peGVyL2Fsc2FtaXhlci4xCkBAIC0wLDAgKzEsMTc4IEBACisuVEggQUxTQU1JWEVSIDEgIjIyIE1heSAyMDA5IgorLlNIIE5BTUUKK2Fsc2FtaXhlciBcLSBzb3VuZGNhcmQgbWl4ZXIgZm9yIEFMU0Egc291bmRjYXJkIGRyaXZlciwgd2l0aCBuY3Vyc2VzIGludGVyZmFjZQorLlNIIFNZTk9QU0lTCisKK1xmQmFsc2FtaXhlclxmUCBbXGZJb3B0aW9uc1xmUF0KKworLlNIIERFU0NSSVBUSU9OCitcZkJhbHNhbWl4ZXJcZlAgaXMgYW4gbmN1cnNlcyBtaXhlciBwcm9ncmFtIGZvciB1c2Ugd2l0aCB0aGUgQUxTQQorc291bmRjYXJkIGRyaXZlcnMuIEl0IHN1cHBvcnRzIG11bHRpcGxlIHNvdW5kY2FyZHMgd2l0aCBtdWx0aXBsZSBkZXZpY2VzLgorCisuU0ggT1BUSU9OUworCisuVFAKK1xmSVwtaCwgXC1cLWhlbHBcZlAKK0hlbHA6IHNob3cgYXZhaWxhYmxlIGZsYWdzLgorCisuVFAKK1xmSVwtYywgXC1cLWNhcmRcZlAgPGNhcmQgbnVtYmVyIG9yIGlkZW50aWZpY2F0aW9uPgorU2VsZWN0IHRoZSBzb3VuZGNhcmQgdG8gdXNlLCBpZiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lLiBDYXJkcyBhcmUKK251bWJlcmVkIGZyb20gMCAodGhlIGRlZmF1bHQpLgorCisuVFAKK1xmSVwtRCwgXC1cLWRldmljZVxmUCA8ZGV2aWNlIGlkZW50aWZpY2F0aW9uPgorU2VsZWN0IHRoZSBtaXhlciBkZXZpY2UgdG8gY29udHJvbC4KKworLlRQCitcZklcLVYsIFwtXC12aWV3XGZQIDxtb2RlPgorU2VsZWN0IHRoZSBzdGFydGluZyB2aWV3IG1vZGUsIGVpdGhlciBcZklwbGF5YmFja1xmUCwgXGZJY2FwdHVyZVxmUCBvciBcZklhbGxcZlAuCisKKy5UUAorXGZJXC1nLCBcLVwtbm9cLWNvbG9yXGZQCitUb2dnbGUgdGhlIHVzaW5nIG9mIGNvbG9ycy4KKworLlNIIE1JWEVSIFZJRVdTCisKK1RoZSB0b3AtbGVmdCBjb3JuZXIgb2YgXGZCYWxzYW1peGVyXGZQIGlzIHRoZSBhcmUgdG8gc2hvdyBzb21lIGJhc2ljCitpbmZvcm1hdGlvbjogdGhlIGNhcmQgbmFtZSwgdGhlIG1peGVyIGNoaXAgbmFtZSwgdGhlIGN1cnJlbnQgdmlldworbW9kZSBhbmQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtaXhlciBpdGVtLgorV2hlbiB0aGUgbWl4ZXIgaXRlbSBpcyBzd2l0Y2hlZCBvZmYsIFxmSVtPZmZdXGZQIGlzIGRpc3BsYXllZCBpbiBpdHMKK25hbWUuCisKK1ZvbHVtZSBiYXJzIGFyZSBsb2NhdGVkIGJlbG93IHRoZSBiYXNpYyBpbmZvcm1hdGlvbiBhcmVhLiAgWW91IGNhbgorc2Nyb2xsIGxlZnQvcmlnaHQgd2hlbiBhbGwgY29udHJvbHMgY2FuJ3QgYmUgcHV0IGluIGEgc2luZ2xlIHNjcmVlbi4KK1RoZSBuYW1lIG9mIGVhY2ggY29udHJvbCBpcyBzaG93biBpbiB0aGUgYm90dG9tIGJlbG93IHRoZSB2b2x1bWUgYmFycy4KK1RoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSBpcyBkcmF3biBpbiByZWQgYW5kL29mIGVtcGhhc2l6ZWQuCisKK0VhY2ggbWl4ZXIgY29udHJvbCB3aXRoIHZvbHVtZSBjYXBhYmlsaXR5IHNob3dzIGEgYm94IGFuZCB0aGUgY3VycmVudAordm9sdW1lIGZpbGxlZCBpbiB0aGF0IGJveC4gIFRoZSB2b2x1bWUgcGVyY2VudGFnZXMgYXJlIGRpc3BsYXllZCBiZWxvdwordGhlIHZvbHVtZSBiYXIgZm9yIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWxzLiAgRm9yIGEgbW9ubyBjb250cm9sLCBvbmx5CitvbmUgdmFsdWUgaXMgc2hvd24gdGhlcmUuCisKK1doZW4gYSBtaXhlciBjb250cm9sIGlzIHR1cm5lZCBvZmYsIFxmSU1cZlAgKG11dGUpIGFwcGVhcnMgYmVsb3cgdGhlCit2b2x1bWUgYmFyLiAgV2hlbiBpdCdzIHR1cm5lZCBvbiwgXGZJT1xmUCBpbiBncmVlbiBhcHBlYXJzIGluc3RlYWQuCitZb3UgY2FuIHRvZ2dsZSB0aGUgc3dpdGNoIHZpYSBcZkltXGZQIGtleS4KKworV2hlbiBhIG1peGVyIGNvbnRyb2wgaGFzIGNhcHR1cmUgY2FwYWJpbGl0eSwgdGhlIGNhcHR1cmUgZmxhZyBhcHBlYXJzCitiZWxvdyB0aGUgdm9sdW1lIGJhciwgdG9vLiAgV2hlbiB0aGUgY2FwdHVyZSBpcyB0dXJuZWQgb2ZmLAorXC1cLVwtXC1cLVwtXC0gaXMgc2hvd24uICBcZklDQVBUVVJFXGZQIGluIHJlZCBhcHBlYXJzIHdoZW4gdGhlCitjYXB0dXJlIHN3aXRjaCBpcyB0dXJuZWQgb24uICBJbiBhZGRpdGlvbiwgXGZJTFxmUCBhbmQgXGZJUlxmUCBsZXR0ZXJzCithcHBlYXIgaW4gbGVmdCBhbmQgcmlnaHQgc2lkZSB0byBpbmRpY2F0ZSB0aGF0IGxlZnQgYW5kIHRoZSByaWdodAorY2hhbm5lbHMgYXJlIHR1cm5lZCBvbi4KKworU29tZSBjb250cm9scyBoYXZlIHRoZSBlbnVtZXJhdGlvbiBsaXN0LCBhbmQgZG9uJ3Qgc2hvdyBib3hlcyBidXQgb25seQordGV4dHMgd2hpY2ggaW5kaWNhdGUgdGhlIGN1cnJlbnRseSBhY3RpdmUgaXRlbS4gIFlvdSBjYW4gY2hhbmdlIHRoZQoraXRlbSB2aWEgdXAvZG93biBrZXlzLgorCisuU0ggVklFVyBNT0RFUworXGZCYWxzYW1peGVyXGZQIGhhcyB0aHJlZSB2aWV3IG1vZGVzOiBwbGF5YmFjaywgY2FwdHVyZSBhbmQgYWxsLgorSW4gdGhlIHBsYXliYWNrIHZpZXcsIG9ubHkgdGhlIGNvbnRyb2xzIHJlbGF0ZWQgd2l0aCBwbGF5YmFjayBhcmUgc2hvd24uCitTaW1pbGFybHksIG9ubHkgdGhlIGNvbnRyb2xzIGZvciBjYXB0dXJlIChyZWNvcmRpbmcpIGFyZSBzaG93biBpbiB0aGUgY2FwdHVyZQordmlldy4gIFRoZSBhbGwgdmlldyBtb2RlIHNob3dzIGFsbCBjb250cm9scy4gIFRoZSBjdXJyZW50IHZpZXcgbW9kZSBpcyBkaXNwbGF5ZWQKK2luIHRoZSB0b3AtbGVmdCBwb3NpdGlvbiB0b2dldGhlciB3aXRoIHRoZSBtaXhlciBuYW1lLCBldGMuCisKK1RoZSBkZWZhdWx0IHZpZXcgbW9kZSBpcyB0aGUgcGxheWJhY2sgdmlldy4gIFlvdSBjYW4gY2hhbmdlIGl0IHZpYSAKK1xmSS1WXGZQIG9wdGlvbi4KKworRWFjaCB2aWV3IG1vZGUgY2FuIGJlIHN3aXRjaGVkIHZpYSBrZXlib2FyZCBjb21tYW5kcywgdG9vLgorU2VlIHRoZSBuZXh0IHNlY3Rpb24uCisKKy5TSCBLRVlCT0FSRCBDT01NQU5EUworXGZCYWxzYW1peGVyXGZQIHJlY29nbml6ZXMgdGhlIGZvbGxvd2luZyBrZXlib2FyZCBjb21tYW5kcyB0byBjb250cm9sIHRoZSBzb3VuZGNhcmQuIAorQ29tbWFuZHMgc2hvd24gaGVyZSBpbiB1cHBlciBjYXNlIGNhbiBhbHNvIGJlIGdpdmVuIGluIGxvd2VyIGNhc2UuCitUbyBiZSByZW1pbmRlZCBvZiB0aGVzZSBrZXlzdHJva2VzLCBoaXQgdGhlIFxmSWhcZlAga2V5LgorCisuU1MKK0dlbmVyYWwgQ29udHJvbHMKKworVGhlIFxmSUxlZnRcZlAgYW5kIFxmSXJpZ2h0IGFycm93XGZQIGtleXMgYXJlIHVzZWQgdG8gc2VsZWN0IHRoZQorY2hhbm5lbCAob3IgZGV2aWNlLCBkZXBlbmRpbmcgb24geW91ciBwcmVmZXJyZWQgdGVybWlub2xvZ3kpLiBZb3UgY2FuCithbHNvIHVzZSBcZkluXGZQICgibmV4dCIpIGFuZCBcZklwXGZQICgicHJldmlvdXMiKS4KKworVGhlIFxmSVVwXGZQIGFuZCBcZklEb3duIEFycm93c1xmUCBjb250cm9sIHRoZSB2b2x1bWUgZm9yIHRoZQorY3VycmVudGx5IHNlbGVjdGVkIGRldmljZS4gWW91IGNhbiBhbHNvIHVzZSBcZkkrXGZQIG9yIFxmSVwtXGZQIGZvciB0aGUKK3NhbWUgcHVycG9zZS4gQm90aCB0aGUgbGVmdCBhbmQgcmlnaHQgc2lnbmFscyBhcmUgYWZmZWN0ZWQuIEZvcgoraW5kZXBlbmRlbnQgbGVmdCBhbmQgcmlnaHQgY29udHJvbCwgc2VlIGJlbG93LgorIAorVGhlIFxmSUJcZlAgb3IgXGZJPVxmUCBrZXkgYWRqdXN0cyB0aGUgYmFsYW5jZSBvZiB2b2x1bWVzIG9uIGxlZnQgYW5kCityaWdodCBjaGFubmVscy4KKworXGZJTVxmUCB0b2dnbGVzIG11dGluZyBmb3IgdGhlIGN1cnJlbnQgY2hhbm5lbCAoYm90aCBsZWZ0IGFuZCByaWdodCkuCitJZiB0aGUgaGFyZHdhcmUgc3VwcG9ydHMgaXQsIHlvdSBjYW4KK211dGUgbGVmdCBhbmQgcmlnaHQgaW5kZXBlbmRlbnRseSBieSB1c2luZyBcZkksXGZQIChvciBcZkk8XGZQKSBhbmQKK1xmSS5cZlAgKG9yIFxmST5cZlApIHJlc3BlY3RpdmVseS4KKworXGZJU1BBQ0VcZlAgZW5hYmxlcyByZWNvcmRpbmcgZm9yIHRoZSBjdXJyZW50IGNoYW5uZWwuIElmIGFueSBvdGhlcgorY2hhbm5lbHMgaGF2ZSByZWNvcmRpbmcgZW5hYmxlZCwgdGhleSB3aWxsIGhhdmUgdGhlaXIgcmVjb3JkaW5nIGZ1bmN0aW9uCitkaXNhYmxlZCBmaXJzdC4gVGhpcyBvbmx5IHdvcmtzIGZvciB2YWxpZCBpbnB1dCBjaGFubmVscywgb2YgY291cnNlLgorCitcZklMXGZQIHJlLWRyYXdzIHRoZSBzY3JlZW4uCisKKy5TUworVmlldyBNb2RlIENvbnRyb2xzCitGdW5jdGlvbiBrZXlzIGFyZSB1c2VkIHRvIGNoYW5nZSB2aWV3IG1vZGVzLgorWW91IGNhbiBzd2l0Y2ggdG8gdGhlIGhlbHAgbW9kZSBhbmQgdGhlIHByb2MgaW5mbyBtb2RlIHZpYSBcZklGMVxmUCBhbmQKK1xmSUYyXGZQIGtleXMsIHJlc3BlY3RpdmVseS4KK09uIHRlcm1pbmFscyB0aGF0IGNhbid0IHVzZSBmdW5jdGlvbiBrZXlzIGxpa2UgZ25vbWVcLXRlcm1pbmFsLCBcZkk/XGZQIGFuZAorXGZJL1xmUCBrZXlzIGNhbiBiZSB1c2VkIGFsdGVybmF0aXZlbHkgZm9yIGhlbHAgYW5kIHByb2MgbW9kZXMuCisKK1xmSUYzXGZQLCBcZklGNFxmUCBhbmQgXGZJRjVcZlAga2V5cyBhcmUgdXNlZCB0byBzd2l0Y2ggdG8gcGxheWJhY2ssIGNhcHR1cmUKK2FuZCBhbGwgdmlldyBtb2RlLCByZXNwZWN0aXZlbHkuICBcZklUQUJcZlAga2V5IHRvZ2dsZXMgdGhlCitjdXJyZW50IHZpZXcgbW9kZSBjaXJjdWxhcmx5LgorCisuU1MKK1F1aWNrIFZvbHVtZSBDaGFuZ2VzCisKK1xmSVBhZ2VVcFxmUCBpbmNyZWFzZXMgdm9sdW1lIGJ5IDUuCisKK1xmSVBhZ2VEb3duXGZQIGRlY3JlYXNlcyB2b2x1bWUgYnkgNS4KKworXGZJRW5kXGZQIHNldHMgdm9sdW1lIHRvIDAuCisKK1lvdSBjYW4gYWxzbyBjb250cm9sIGxlZnQgJiByaWdodCBsZXZlbHMgZm9yIHRoZSBjdXJyZW50IGNoYW5uZWwKK2luZGVwZW5kZW50bHksIGFzIGZvbGxvd3M6CisKK1tcZklRXGZQIHwgXGZJV1xmUCB8IFxmSUVcZlAgXSAgLS0gdHVybiBVUCBbIGxlZnQgfCBib3RoIHwgcmlnaHQgXQorCitbXGZJWlxmUCB8IFxmSVhcZlAgfCBcZklDXGZQIF0gLS0gdHVybiBET1dOIFsgbGVmdCB8IGJvdGggfCByaWdodCBdICAgCisKK0lmIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWl4ZXIgY2hhbm5lbCBpcyBub3QgYSBzdGVyZW8gY2hhbm5lbCwgdGhlbgorYWxsIFVQIGtleXMgd2lsbCB3b3JrIGxpa2UgXGZJV1xmUCwgYW5kIGFsbCBET1dOIGtleXMgd2lsbCB3b3JrIGxpa2UgXGZJWFxmUC4KKworVGhlIG51bWJlciBrZXlzIGZyb20gXGZJMFxmUCB0byBcZkk5XGZQIGFyZSB0byBjaGFuZ2UgdGhlIGFic29sdXRlIHZvbHVtZQorcXVpY2tseS4gIFRoZXkgY29ycmVzcG9uZCB0byAwIHRvIDkwJSB2b2x1bWUuCisKKy5TUworU2VsZWN0aW5nIHRoZSBTb3VuZCBDYXJkCisKK1lvdSBjYW4gc2VsZWN0IGFub3RoZXIgc291bmQgY2FyZCBieSBwcmVzc2luZyB0aGUgXGZJRjZcZlAgb3IgXGZJU1xmUCBrZXlzLgorVGhpcyB3aWxsIHNob3cgYSBsaXN0IG9mIGF2YWlsYWJsZSBzb3VuZCBjYXJkcyB0byBjaG9vc2UgZnJvbSwKK2FuZCBhbiBlbnRyeSB0byBlbnRlciB0aGUgbWl4ZXIgZGV2aWNlIG5hbWUgYnkgaGFuZC4KKworLlNTCitFeGl0aW5nCisKK1F1aXQgdGhlIHByb2dyYW0gd2l0aCBcZklBTFQgUVxmUCwgb3IgYnkgaGl0dGluZyBcZklFU0NcZlAuCitQbGVhc2Ugbm90ZSB0aGF0IHlvdSBtaWdodCBuZWVkIHRvIGhpdCBcZklFU0NcZlAgdHdpY2Ugb24gc29tZSB0ZXJtaW5hbHMKK3NpbmNlIGl0J3MgcmVnYXJkZWQgYXMgYSBwcmVmaXgga2V5LgorCisuU0ggU0VFIEFMU08KK1xmQgorYW1peGVyKDEpLAorYXBsYXkoMSksCithcmVjb3JkKDEpCitcZlAKKworLlNIIEJVR1MgCitTb21lIHRlcm1pbmFsIGVtdWxhdG9ycyAoZS5nLiBcZkJueHRlcm1cZlApIG1heSBub3QKK3dvcmsgcXVpdGUgcmlnaHQgd2l0aCBuY3Vyc2VzLCBidXQgdGhhdCdzIHRoZWlyIG93biBkYW1uCitmYXVsdC4gUGxhaW4gb2xkIFxmQnh0ZXJtXGZQIHNlZW1zIHRvIGJlIGZpbmUuCisKKy5TSCBBVVRIT1IKKy5CIGFsc2FtaXhlcgoraGFzIGJlZW4gd3JpdHRlbiBieSBUaW0gSmFuaWsgYW5kCitiZWVuIGZ1cnRoZXIgaW1wcm92ZWQgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KK2FuZCBDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4uCisKK1RoaXMgbWFudWFsIHBhZ2Ugd2FzIHByb3ZpZGVkIGJ5IFBhdWwgV2lua2xlciA8emFybXphcm1AZXJvbHMuY29tPi4KZGlmZiAtLWdpdCBhL2Fsc2FtaXhlci9jYXJkX3NlbGVjdC5jIGIvYWxzYW1peGVyL2NhcmRfc2VsZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ3M2RjZgotLS0gL2Rldi9udWxsCisrKyBiL2Fsc2FtaXhlci9jYXJkX3NlbGVjdC5jCkBAIC0wLDAgKzEsMjY4IEBACisvKgorICogY2FyZF9zZWxlY3QuYyAtIHNlbGVjdCBhIGNhcmQgYnkgbGlzdCBvciBkZXZpY2UgbmFtZQorICogQ29weXJpZ2h0IChjKSBDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJhY29uZmlnLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxhbHNhL2Fzb3VuZGxpYi5oPgorI2luY2x1ZGUgPG1lbnUuaD4KKyNpbmNsdWRlICJnZXR0ZXh0X2N1cnNlcy5oIgorI2luY2x1ZGUgImRpZS5oIgorI2luY2x1ZGUgIm1lbS5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiY29sb3JzLmgiCisjaW5jbHVkZSAid2lkZ2V0LmgiCisjaW5jbHVkZSAibWl4ZXJfd2lkZ2V0LmgiCisjaW5jbHVkZSAiZGV2aWNlX25hbWUuaCIKKyNpbmNsdWRlICJjYXJkX3NlbGVjdC5oIgorCitzdHJ1Y3QgY2FyZCB7CisJc3RydWN0IGNhcmQgKm5leHQ7CisJY2hhciAqaW5kZXhzdHI7CisJY2hhciAqbmFtZTsKKwljaGFyICpkZXZpY2VfbmFtZTsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgd2lkZ2V0IGxpc3Rfd2lkZ2V0Oworc3RhdGljIHN0cnVjdCBjYXJkIGZpcnN0X2NhcmQ7CitzdGF0aWMgSVRFTSAqKml0ZW1zOworc3RhdGljIE1FTlUgKm1lbnU7CitzdGF0aWMgSVRFTSAqaW5pdGlhbF9pdGVtOworCitzdGF0aWMgdm9pZCBvbl9rZXlfZW50ZXIodm9pZCkKK3sKKwlJVEVNICppdGVtID0gY3VycmVudF9pdGVtKG1lbnUpOworCWlmIChpdGVtKSB7CisJCXN0cnVjdCBjYXJkICpjYXJkID0gaXRlbV91c2VycHRyKGl0ZW0pOworCQlpZiAoY2FyZC0+ZGV2aWNlX25hbWUpIHsKKwkJCWlmIChzZWxlY3RfY2FyZF9ieV9uYW1lKGNhcmQtPmRldmljZV9uYW1lKSkKKwkJCQlsaXN0X3dpZGdldC5jbG9zZSgpOworCQl9IGVsc2UgeworCQkJY3JlYXRlX2RldmljZV9uYW1lX2Zvcm0oKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgb25fbWVudV9rZXkoaW50IGtleSkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwkJaW50IGtleTsKKwkJaW50IHJlcXVlc3Q7CisJfSBrZXlfbWFwW10gPSB7CisJCXsgS0VZX0RPV04sIFJFUV9ET1dOX0lURU0gfSwKKwkJeyBLRVlfVVAsIFJFUV9VUF9JVEVNIH0sCisJCXsgS0VZX0hPTUUsIFJFUV9GSVJTVF9JVEVNIH0sCisJCXsgS0VZX05QQUdFLCBSRVFfU0NSX0RQQUdFIH0sCisJCXsgS0VZX1BQQUdFLCBSRVFfU0NSX1VQQUdFIH0sCisJCXsgS0VZX0JFRywgUkVRX0ZJUlNUX0lURU0gfSwKKwkJeyBLRVlfRU5ELCBSRVFfTEFTVF9JVEVNIH0sCisJfTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtleV9tYXApOyArK2kpCisJCWlmIChrZXlfbWFwW2ldLmtleSA9PSBrZXkpIHsKKwkJCW1lbnVfZHJpdmVyKG1lbnUsIGtleV9tYXBbaV0ucmVxdWVzdCk7CisJCQlicmVhazsKKwkJfQorfQorCitzdGF0aWMgdm9pZCBvbl9oYW5kbGVfa2V5KGludCBrZXkpCit7CisJc3dpdGNoIChrZXkpIHsKKwljYXNlIDI3OgorCWNhc2UgS0VZX0NBTkNFTDoKKwljYXNlICdxJzoKKwljYXNlICdRJzoKKwkJbGlzdF93aWRnZXQuY2xvc2UoKTsKKwkJYnJlYWs7CisJY2FzZSAxMDoKKwljYXNlIDEzOgorCWNhc2UgS0VZX0VOVEVSOgorCQlvbl9rZXlfZW50ZXIoKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJb25fbWVudV9rZXkoa2V5KTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgYm9vbCBjcmVhdGUodm9pZCkKK3sKKwlpbnQgcm93cywgY29sdW1uczsKKwljb25zdCBjaGFyICp0aXRsZTsKKworCWlmIChzY3JlZW5fbGluZXMgPCAzIHx8IHNjcmVlbl9jb2xzIDwgMTApIHsKKwkJYmVlcCgpOworCQlsaXN0X3dpZGdldC5jbG9zZSgpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCXNjYWxlX21lbnUobWVudSwgJnJvd3MsICZjb2x1bW5zKTsKKwlyb3dzICs9IDI7CisJY29sdW1ucyArPSAyOworCWlmIChyb3dzID4gc2NyZWVuX2xpbmVzKQorCQlyb3dzID0gc2NyZWVuX2xpbmVzOworCWlmIChjb2x1bW5zID4gc2NyZWVuX2NvbHMpCisJCWNvbHVtbnMgPSBzY3JlZW5fY29sczsKKworCXdpZGdldF9pbml0KCZsaXN0X3dpZGdldCwgcm93cywgY29sdW1ucywgU0NSRUVOX0NFTlRFUiwgU0NSRUVOX0NFTlRFUiwKKwkJICAgIGF0dHJfbWVudSwgV0lER0VUX0JPUkRFUiB8IFdJREdFVF9TVUJXSU5ET1cpOworCisJdGl0bGUgPSBfKCJTb3VuZCBDYXJkIik7CisJbXZ3cHJpbnR3KGxpc3Rfd2lkZ2V0LndpbmRvdywgMCwgKGNvbHVtbnMgLSAyIC0gZ2V0X21ic193aWR0aCh0aXRsZSkpIC8gMiwgIiAlcyAiLCB0aXRsZSk7CisJc2V0X21lbnVfd2luKG1lbnUsIGxpc3Rfd2lkZ2V0LndpbmRvdyk7CisJc2V0X21lbnVfc3ViKG1lbnUsIGxpc3Rfd2lkZ2V0LnN1YndpbmRvdyk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkIG9uX3dpbmRvd19zaXplX2NoYW5nZWQodm9pZCkKK3sKKwl1bnBvc3RfbWVudShtZW51KTsKKwlpZiAoIWNyZWF0ZSgpKQorCQlyZXR1cm47CisJcG9zdF9tZW51KG1lbnUpOworfQorCitzdGF0aWMgdm9pZCBvbl9jbG9zZSh2b2lkKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBjYXJkICpjYXJkLCAqbmV4dF9jYXJkOworCisJdW5wb3N0X21lbnUobWVudSk7CisJZnJlZV9tZW51KG1lbnUpOworCWZvciAoaSA9IDA7IGl0ZW1zW2ldOyArK2kpCisJCWZyZWVfaXRlbShpdGVtc1tpXSk7CisJZnJlZShpdGVtcyk7CisJZm9yIChjYXJkID0gZmlyc3RfY2FyZC5uZXh0OyBjYXJkOyBjYXJkID0gbmV4dF9jYXJkKSB7CisJCW5leHRfY2FyZCA9IGNhcmQtPm5leHQ7CisJCWZyZWUoY2FyZC0+aW5kZXhzdHIpOworCQlmcmVlKGNhcmQtPm5hbWUpOworCQlmcmVlKGNhcmQtPmRldmljZV9uYW1lKTsKKwkJZnJlZShjYXJkKTsKKwl9CisJd2lkZ2V0X2ZyZWUoJmxpc3Rfd2lkZ2V0KTsKK30KKwordm9pZCBjbG9zZV9jYXJkX3NlbGVjdF9saXN0KHZvaWQpCit7CisJb25fY2xvc2UoKTsKK30KKworc3RhdGljIHN0cnVjdCB3aWRnZXQgbGlzdF93aWRnZXQgPSB7CisJLmhhbmRsZV9rZXkgPSBvbl9oYW5kbGVfa2V5LAorCS53aW5kb3dfc2l6ZV9jaGFuZ2VkID0gb25fd2luZG93X3NpemVfY2hhbmdlZCwKKwkuY2xvc2UgPSBvbl9jbG9zZSwKK307CisKK3N0YXRpYyBpbnQgZ2V0X2NhcmRzKHZvaWQpCit7CisJaW50IGNvdW50LCBudW1iZXIsIGVycjsKKwlzbmRfY3RsX3QgKmN0bDsKKwlzbmRfY3RsX2NhcmRfaW5mb190ICppbmZvOworCWNoYXIgYnVmWzE2XTsKKwlzdHJ1Y3QgY2FyZCAqY2FyZCwgKnByZXZfY2FyZDsKKworCWZpcnN0X2NhcmQuaW5kZXhzdHIgPSAiLSI7CisJZmlyc3RfY2FyZC5uYW1lID0gXygiKGRlZmF1bHQpIik7CisJZmlyc3RfY2FyZC5kZXZpY2VfbmFtZSA9ICJkZWZhdWx0IjsKKwljb3VudCA9IDE7CisKKwlzbmRfY3RsX2NhcmRfaW5mb19hbGxvY2EoJmluZm8pOworCXByZXZfY2FyZCA9ICZmaXJzdF9jYXJkOworCW51bWJlciA9IC0xOworCWZvciAoOzspIHsKKwkJZXJyID0gc25kX2NhcmRfbmV4dCgmbnVtYmVyKTsKKwkJaWYgKGVyciA8IDApCisJCQlmYXRhbF9hbHNhX2Vycm9yKF8oImNhbm5vdCBlbnVtZXJhdGUgc291bmQgY2FyZHMiKSwgZXJyKTsKKwkJaWYgKG51bWJlciA8IDApCisJCQlicmVhazsKKwkJc3ByaW50ZihidWYsICJodzolZCIsIG51bWJlcik7CisJCWVyciA9IHNuZF9jdGxfb3BlbigmY3RsLCBidWYsIDApOworCQlpZiAoZXJyIDwgMCkKKwkJCWNvbnRpbnVlOworCQllcnIgPSBzbmRfY3RsX2NhcmRfaW5mbyhjdGwsIGluZm8pOworCQlzbmRfY3RsX2Nsb3NlKGN0bCk7CisJCWlmIChlcnIgPCAwKQorCQkJY29udGludWU7CisJCWNhcmQgPSBjY2FsbG9jKDEsIHNpemVvZiAqY2FyZCk7CisJCXNwcmludGYoYnVmLCAiJWQiLCBudW1iZXIpOworCQljYXJkLT5pbmRleHN0ciA9IGNzdHJkdXAoYnVmKTsKKwkJY2FyZC0+bmFtZSA9IGNzdHJkdXAoc25kX2N0bF9jYXJkX2luZm9fZ2V0X25hbWUoaW5mbykpOworCQlzcHJpbnRmKGJ1ZiwgImh3OiVkIiwgbnVtYmVyKTsKKwkJY2FyZC0+ZGV2aWNlX25hbWUgPSBjc3RyZHVwKGJ1Zik7CisJCXByZXZfY2FyZC0+bmV4dCA9IGNhcmQ7CisJCXByZXZfY2FyZCA9IGNhcmQ7CisJCSsrY291bnQ7CisJfQorCisJY2FyZCA9IGNjYWxsb2MoMSwgc2l6ZW9mICpjYXJkKTsKKwljYXJkLT5pbmRleHN0ciA9IGNzdHJkdXAoIiAiKTsKKwljYXJkLT5uYW1lID0gY3N0cmR1cChfKCJlbnRlciBkZXZpY2UgbmFtZS4uLiIpKTsKKwlwcmV2X2NhcmQtPm5leHQgPSBjYXJkOworCSsrY291bnQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9saXN0X2l0ZW1zKGludCBjYXJkcykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgY2FyZCAqY2FyZDsKKwlJVEVNICppdGVtOworCisJaW5pdGlhbF9pdGVtID0gTlVMTDsKKwlpdGVtcyA9IGNjYWxsb2MoY2FyZHMgKyAxLCBzaXplb2YoSVRFTSopKTsKKwlpID0gMDsKKwlmb3IgKGNhcmQgPSAmZmlyc3RfY2FyZDsgY2FyZDsgY2FyZCA9IGNhcmQtPm5leHQpIHsKKwkJaXRlbSA9IG5ld19pdGVtKGNhcmQtPmluZGV4c3RyLCBjYXJkLT5uYW1lKTsKKwkJaWYgKCFpdGVtKQorCQkJZmF0YWxfZXJyb3IoImNhbm5vdCBjcmVhdGUgbWVudSBpdGVtIik7CisJCXNldF9pdGVtX3VzZXJwdHIoaXRlbSwgY2FyZCk7CisJCWl0ZW1zW2krK10gPSBpdGVtOworCQlpZiAoIWluaXRpYWxfaXRlbSAmJgorCQkgICAgbWl4ZXJfZGV2aWNlX25hbWUgJiYKKwkJICAgICghY2FyZC0+ZGV2aWNlX25hbWUgfHwKKwkJICAgICAhc3RyY21wKGNhcmQtPmRldmljZV9uYW1lLCBtaXhlcl9kZXZpY2VfbmFtZSkpKQorCQkJaW5pdGlhbF9pdGVtID0gaXRlbTsKKwl9CisJYXNzZXJ0KGkgPT0gY2FyZHMpOworfQorCit2b2lkIGNyZWF0ZV9jYXJkX3NlbGVjdF9saXN0KHZvaWQpCit7CisJaW50IGNhcmRzOworCisJY2FyZHMgPSBnZXRfY2FyZHMoKTsKKwljcmVhdGVfbGlzdF9pdGVtcyhjYXJkcyk7CisKKwltZW51ID0gbmV3X21lbnUoaXRlbXMpOworCWlmICghbWVudSkKKwkJZmF0YWxfZXJyb3IoImNhbm5vdCBjcmVhdGUgbWVudSIpOworCXNldF9tZW51X2ZvcmUobWVudSwgYXR0cl9tZW51X3NlbGVjdGVkKTsKKwlzZXRfbWVudV9iYWNrKG1lbnUsIGF0dHJfbWVudSk7CisJc2V0X21lbnVfbWFyayhtZW51LCBOVUxMKTsKKwlpZiAoaW5pdGlhbF9pdGVtKQorCQlzZXRfY3VycmVudF9pdGVtKG1lbnUsIGluaXRpYWxfaXRlbSk7CisJc2V0X21lbnVfc3BhY2luZyhtZW51LCAyLCAxLCAxKTsKKwltZW51X29wdHNfb24obWVudSwgT19TSE9XREVTQyk7CisKKwlpZiAoIWNyZWF0ZSgpKQorCQlyZXR1cm47CisKKwlwb3N0X21lbnUobWVudSk7Cit9CmRpZmYgLS1naXQgYS9hbHNhbWl4ZXIvY2FyZF9zZWxlY3QuaCBiL2Fsc2FtaXhlci9jYXJkX3NlbGVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYTE1ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbHNhbWl4ZXIvY2FyZF9zZWxlY3QuaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgQ0FSRF9TRUxFQ1RfSF9JTkNMVURFRAorI2RlZmluZSBDQVJEX1NFTEVDVF9IX0lOQ0xVREVECisKK3ZvaWQgY3JlYXRlX2NhcmRfc2VsZWN0X2xpc3Qodm9pZCk7Cit2b2lkIGNsb3NlX2NhcmRfc2VsZWN0X2xpc3Qodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYWxzYW1peGVyL2NsaS5jIGIvYWxzYW1peGVyL2NsaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNGYwMzAKLS0tIC9kZXYvbnVsbAorKysgYi9hbHNhbWl4ZXIvY2xpLmMKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBhbHNhbWl4ZXIgLSBjdXJzZXMgbWl4ZXIgZm9yIHRoZSBBTFNBIHByb2plY3QKKyAqIENvcHlyaWdodCAoYykgMTk5OCwxOTk5IFRpbSBKYW5paworICogICAgICAgICAgICAgICAgICAgICAgICAgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIENvcHlyaWdodCAoYykgMjAwOSAgICAgIENsZW1lbnMgTGFkaXNjaCA8Y2xlbWVuc0BsYWRpc2NoLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgImFjb25maWcuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxvY2FsZS5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGFsc2EvYXNvdW5kbGliLmg+CisjaW5jbHVkZSAiZ2V0dGV4dF9jdXJzZXMuaCIKKyNpbmNsdWRlICJtaXhlcl93aWRnZXQuaCIKKyNpbmNsdWRlICJtYWlubG9vcC5oIgorCitzdGF0aWMgaW50IHVzZV9jb2xvciA9IDE7CitzdGF0aWMgc3RydWN0IHNuZF9taXhlcl9zZWxlbV9yZWdvcHQgc2VsZW1fcmVnb3B0ID0geworCS52ZXIgPSAxLAorCS5hYnN0cmFjdCA9IFNORF9NSVhFUl9TQUJTVFJBQ1RfTk9ORSwKKwkuZGV2aWNlID0gImRlZmF1bHQiLAorfTsKKworc3RhdGljIHZvaWQgc2hvd19oZWxwKHZvaWQpCit7CisJcHV0cyhfKCJVc2FnZTogYWxzYW1peGVyIFtvcHRpb25zXSIpKTsKKwlwdXRzKF8oIlVzZWZ1bCBvcHRpb25zOlxuIgorCSAgICAgICAiICAtaCwgLS1oZWxwICAgICAgICAgICAgICB0aGlzIGhlbHBcbiIKKwkgICAgICAgIiAgLWMsIC0tY2FyZD1OVU1CRVIgICAgICAgc291bmQgY2FyZCBudW1iZXIgb3IgaWRcbiIKKwkgICAgICAgIiAgLUQsIC0tZGV2aWNlPU5BTUUgICAgICAgbWl4ZXIgZGV2aWNlIG5hbWVcbiIKKwkgICAgICAgIiAgLVYsIC0tdmlldz1NT0RFICAgICAgICAgc3RhcnRpbmcgdmlldyBtb2RlOiBwbGF5YmFjay9jYXB0dXJlL2FsbCIpKTsKKwlwdXRzKF8oIkRlYnVnZ2luZyBvcHRpb25zOlxuIgorCSAgICAgICAiICAtZywgLS1uby1jb2xvciAgICAgICAgICB0b2dnbGUgdXNpbmcgb2YgY29sb3JzXG4iCisJICAgICAgICIgIC1hLCAtLWFic3RyYWN0aW9uPU5BTUUgIG1peGVyIGFic3RyYWN0aW9uIGxldmVsOiBub25lL2Jhc2ljIikpOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV9vcHRpb25zKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgc2hvcnRfb3B0aW9uc1tdID0gImhjOkQ6Vjpnc2E6IjsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKKwkJeyAubmFtZSA9ICJoZWxwIiwgLnZhbCA9ICdoJyB9LAorCQl7IC5uYW1lID0gImNhcmQiLCAuaGFzX2FyZyA9IDEsIC52YWwgPSAnYycgfSwKKwkJeyAubmFtZSA9ICJkZXZpY2UiLCAuaGFzX2FyZyA9IDEsIC52YWwgPSAnRCcgfSwKKwkJeyAubmFtZSA9ICJ2aWV3IiwgLmhhc19hcmcgPSAxLCAudmFsID0gJ1YnIH0sCisJCXsgLm5hbWUgPSAibm8tY29sb3IiLCAudmFsID0gJ2cnIH0sCisJCXsgLm5hbWUgPSAiYWJzdHJhY3Rpb24iLCAuaGFzX2FyZyA9IDEsIC52YWwgPSAnYScgfSwKKwkJeyB9CisJfTsKKwlpbnQgb3B0aW9uOworCWludCBjYXJkX2luZGV4OworCXN0YXRpYyBjaGFyIG5hbWVfYnVmWzE2XTsKKworCXdoaWxlICgob3B0aW9uID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgc2hvcnRfb3B0aW9ucywKKwkJCQkgICAgIGxvbmdfb3B0aW9ucywgTlVMTCkpICE9IC0xKSB7CisJCXN3aXRjaCAob3B0aW9uKSB7CisJCWNhc2UgJz8nOgorCQljYXNlICdoJzoKKwkJCXNob3dfaGVscCgpOworCQkJZXhpdChFWElUX1NVQ0NFU1MpOworCQljYXNlICdjJzoKKwkJCWNhcmRfaW5kZXggPSBzbmRfY2FyZF9nZXRfaW5kZXgob3B0YXJnKTsKKwkJCWlmIChjYXJkX2luZGV4IDwgMCkgeworCQkJCWZwcmludGYoc3RkZXJyLCBfKCJpbnZhbGlkIGNhcmQgaW5kZXg6ICVzXG4iKSwgb3B0YXJnKTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCQlzcHJpbnRmKG5hbWVfYnVmLCAiaHc6JWQiLCBjYXJkX2luZGV4KTsKKwkJCXNlbGVtX3JlZ29wdC5kZXZpY2UgPSBuYW1lX2J1ZjsKKwkJCWJyZWFrOworCQljYXNlICdEJzoKKwkJCXNlbGVtX3JlZ29wdC5kZXZpY2UgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnVic6CisJCQlpZiAoKm9wdGFyZyA9PSAncCcgfHwgKm9wdGFyZyA9PSAnUCcpCisJCQkJdmlld19tb2RlID0gVklFV19NT0RFX1BMQVlCQUNLOworCQkJZWxzZSBpZiAoKm9wdGFyZyA9PSAnYycgfHwgKm9wdGFyZyA9PSAnQycpCisJCQkJdmlld19tb2RlID0gVklFV19NT0RFX0NBUFRVUkU7CisJCQllbHNlCisJCQkJdmlld19tb2RlID0gVklFV19NT0RFX0FMTDsKKwkJCWJyZWFrOworCQljYXNlICdnJzoKKwkJCXVzZV9jb2xvciA9ICF1c2VfY29sb3I7CisJCQlicmVhazsKKwkJY2FzZSAnYSc6CisJCQlpZiAoIXN0cmNtcChvcHRhcmcsICJub25lIikpCisJCQkJc2VsZW1fcmVnb3B0LmFic3RyYWN0ID0gU05EX01JWEVSX1NBQlNUUkFDVF9OT05FOworCQkJZWxzZSBpZiAoIXN0cmNtcChvcHRhcmcsICJiYXNpYyIpKQorCQkJCXNlbGVtX3JlZ29wdC5hYnN0cmFjdCA9IFNORF9NSVhFUl9TQUJTVFJBQ1RfQkFTSUM7CisJCQllbHNlIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgXygidW5rbm93biBhYnN0cmFjdGlvbiBsZXZlbDogJXNcbiIpLCBvcHRhcmcpOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZnByaW50ZihzdGRlcnIsIF8oInVua25vd24gb3B0aW9uOiAlY1xuIiksIG9wdGlvbik7CitmYWlsOgorCQkJZnB1dHMoXygidHJ5IGBhbHNhbWl4ZXIgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvblxuIiksIHN0ZGVycik7CisJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJCX0KKwl9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJc2V0bG9jYWxlKExDX0FMTCwgIiIpOworI2lmZGVmIEVOQUJMRV9OTFNfSU5fQ1VSU0VTCisJdGV4dGRvbWFpbihQQUNLQUdFKTsKKyNlbmRpZgorCisJcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2KTsKKworCWNyZWF0ZV9taXhlcl9vYmplY3QoJnNlbGVtX3JlZ29wdCk7CisKKwlpbml0aWFsaXplX2N1cnNlcyh1c2VfY29sb3IpOworCisJY3JlYXRlX21peGVyX3dpZGdldCgpOworCisJbWFpbmxvb3AoKTsKKworCWFwcF9zaHV0ZG93bigpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYWxzYW1peGVyL2NvbG9ycy5jIGIvYWxzYW1peGVyL2NvbG9ycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0Yjk4ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbHNhbWl4ZXIvY29sb3JzLmMKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBjb2xvcnMuYyAtIGNvbG9yIGFuZCBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMTk5OCwxOTk5IFRpbSBKYW5paworICogICAgICAgICAgICAgICAgICAgICAgICAgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIENvcHlyaWdodCAoYykgMjAwOSAgICAgIENsZW1lbnMgTGFkaXNjaCA8Y2xlbWVuc0BsYWRpc2NoLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgImFjb25maWcuaCIKKyNpbmNsdWRlIENVUlNFU0lOQworI2luY2x1ZGUgImNvbG9ycy5oIgorCitpbnQgYXR0cl9taXhlcl9mcmFtZTsKK2ludCBhdHRyX21peGVyX3RleHQ7CitpbnQgYXR0cl9taXhlcl9hY3RpdmU7CitpbnQgYXR0cl9jdGxfZnJhbWU7CitpbnQgYXR0cl9jdGxfbXV0ZTsKK2ludCBhdHRyX2N0bF9ub211dGU7CitpbnQgYXR0cl9jdGxfY2FwdHVyZTsKK2ludCBhdHRyX2N0bF9ub2NhcHR1cmU7CitpbnQgYXR0cl9jdGxfbGFiZWw7CitpbnQgYXR0cl9jdGxfbGFiZWxfZm9jdXM7CitpbnQgYXR0cl9jdGxfbWFya19mb2N1czsKK2ludCBhdHRyX2N0bF9iYXJfbG87CisjaWZkZWYgVFJJQ09MT1JfVk9MVU1FX0JBUgoraW50IGF0dHJfY3RsX2Jhcl9taTsKK2ludCBhdHRyX2N0bF9iYXJfaGk7CisjZW5kaWYKK2ludCBhdHRyX2N0bF9pbmFjdGl2ZTsKK2ludCBhdHRyX2N0bF9sYWJlbF9pbmFjdGl2ZTsKK2ludCBhdHRyX2Vycm9ybXNnOworaW50IGF0dHJfaW5mb21zZzsKK2ludCBhdHRyX3RleHRib3g7CitpbnQgYXR0cl90ZXh0ZmllbGQ7CitpbnQgYXR0cl9tZW51OworaW50IGF0dHJfbWVudV9zZWxlY3RlZDsKKwordm9pZCBpbml0X2NvbG9ycyhpbnQgdXNlX2NvbG9yKQoreworCWlmICghIWhhc19jb2xvcnMoKSA9PSAhIXVzZV9jb2xvcikgeworCQlzdGFydF9jb2xvcigpOworCisJCWluaXRfcGFpcigxLCBDT0xPUl9DWUFOLCBDT0xPUl9CTEFDSyk7CisJCWluaXRfcGFpcigyLCBDT0xPUl9ZRUxMT1csIENPTE9SX0JMQUNLKTsKKwkJaW5pdF9wYWlyKDMsIENPTE9SX1dISVRFLCBDT0xPUl9HUkVFTik7CisJCWluaXRfcGFpcig0LCBDT0xPUl9SRUQsIENPTE9SX0JMQUNLKTsKKwkJaW5pdF9wYWlyKDUsIENPTE9SX1dISVRFLCBDT0xPUl9CTEFDSyk7CisJCWluaXRfcGFpcig2LCBDT0xPUl9XSElURSwgQ09MT1JfQkxVRSk7CisJCWluaXRfcGFpcig3LCBDT0xPUl9SRUQsIENPTE9SX0JMVUUpOworCQlpbml0X3BhaXIoOCwgQ09MT1JfR1JFRU4sIENPTE9SX0dSRUVOKTsKKwkJaW5pdF9wYWlyKDksIENPTE9SX1dISVRFLCBDT0xPUl9SRUQpOworI2lmZGVmIFRSSUNPTE9SX1ZPTFVNRV9CQVIKKwkJaW5pdF9wYWlyKDEwLCBDT0xPUl9XSElURSwgQ09MT1JfV0hJVEUpOworCQlpbml0X3BhaXIoMTEsIENPTE9SX1JFRCwgQ09MT1JfUkVEKTsKKyNlbmRpZgorCisJCWF0dHJfbWl4ZXJfZnJhbWUgPSBDT0xPUl9QQUlSKDEpOworCQlhdHRyX21peGVyX3RleHQgPSBDT0xPUl9QQUlSKDEpOworCQlhdHRyX21peGVyX2FjdGl2ZSA9IEFfQk9MRCB8IENPTE9SX1BBSVIoMik7CisJCWF0dHJfY3RsX2ZyYW1lID0gQV9CT0xEIHwgQ09MT1JfUEFJUigxKTsKKwkJYXR0cl9jdGxfbXV0ZSA9IENPTE9SX1BBSVIoMSk7CisJCWF0dHJfY3RsX25vbXV0ZSA9IEFfQk9MRCB8IENPTE9SX1BBSVIoMyk7CisJCWF0dHJfY3RsX2NhcHR1cmUgPSBBX0JPTEQgfCBDT0xPUl9QQUlSKDQpOworCQlhdHRyX2N0bF9ub2NhcHR1cmUgPSBDT0xPUl9QQUlSKDUpOworCQlhdHRyX2N0bF9sYWJlbCA9IEFfQk9MRCB8IENPTE9SX1BBSVIoNik7CisJCWF0dHJfY3RsX2xhYmVsX2ZvY3VzID0gQV9CT0xEIHwgQ09MT1JfUEFJUig3KTsKKwkJYXR0cl9jdGxfbWFya19mb2N1cyA9IEFfQk9MRCB8IENPTE9SX1BBSVIoNCk7CisJCWF0dHJfY3RsX2Jhcl9sbyA9IEFfQk9MRCB8IENPTE9SX1BBSVIoOCk7CisjaWZkZWYgVFJJQ09MT1JfVk9MVU1FX0JBUgorCQlhdHRyX2N0bF9iYXJfbWkgPSBBX0JPTEQgfCBDT0xPUl9QQUlSKDEwKTsKKwkJYXR0cl9jdGxfYmFyX2hpID0gQV9CT0xEIHwgQ09MT1JfUEFJUigxMSk7CisjZW5kaWYKKwkJYXR0cl9jdGxfaW5hY3RpdmUgPSBDT0xPUl9QQUlSKDUpOworCQlhdHRyX2N0bF9sYWJlbF9pbmFjdGl2ZSA9IEFfUkVWRVJTRSB8IENPTE9SX1BBSVIoNSk7CisJCWF0dHJfZXJyb3Jtc2cgPSBBX0JPTEQgfCBDT0xPUl9QQUlSKDkpOworCQlhdHRyX2luZm9tc2cgPSBBX0JPTEQgfCBDT0xPUl9QQUlSKDYpOworCQlhdHRyX3RleHRib3ggPSBBX0JPTEQgfCBDT0xPUl9QQUlSKDYpOworCQlhdHRyX3RleHRmaWVsZCA9IEFfUkVWRVJTRSB8IENPTE9SX1BBSVIoNSk7CisJCWF0dHJfbWVudSA9IEFfQk9MRCB8IENPTE9SX1BBSVIoNik7CisJCWF0dHJfbWVudV9zZWxlY3RlZCA9IEFfUkVWRVJTRSB8IENPTE9SX1BBSVIoNik7CisJfSBlbHNlIHsKKwkJYXR0cl9taXhlcl9mcmFtZSA9IEFfTk9STUFMOworCQlhdHRyX21peGVyX3RleHQgPSBBX05PUk1BTDsKKwkJYXR0cl9taXhlcl9hY3RpdmUgPSBBX0JPTEQ7CisJCWF0dHJfY3RsX2ZyYW1lID0gQV9CT0xEOworCQlhdHRyX2N0bF9tdXRlID0gQV9OT1JNQUw7CisJCWF0dHJfY3RsX25vbXV0ZSA9IEFfQk9MRDsKKwkJYXR0cl9jdGxfY2FwdHVyZSA9IEFfQk9MRDsKKwkJYXR0cl9jdGxfbm9jYXB0dXJlID0gQV9OT1JNQUw7CisJCWF0dHJfY3RsX2xhYmVsID0gQV9SRVZFUlNFOworCQlhdHRyX2N0bF9sYWJlbF9mb2N1cyA9IEFfUkVWRVJTRSB8IEFfQk9MRDsKKwkJYXR0cl9jdGxfbWFya19mb2N1cyA9IEFfQk9MRDsKKwkJYXR0cl9jdGxfYmFyX2xvID0gQV9CT0xEOworI2lmZGVmIFRSSUNPTE9SX1ZPTFVNRV9CQVIKKwkJYXR0cl9jdGxfYmFyX21pID0gQV9CT0xEOworCQlhdHRyX2N0bF9iYXJfaGkgPSBBX0JPTEQ7CisjZW5kaWYKKwkJYXR0cl9jdGxfaW5hY3RpdmUgPSBBX05PUk1BTDsKKwkJYXR0cl9jdGxfbGFiZWxfaW5hY3RpdmUgPSBBX1JFVkVSU0U7CisJCWF0dHJfZXJyb3Jtc2cgPSBBX1NUQU5ET1VUOworCQlhdHRyX2luZm9tc2cgPSBBX05PUk1BTDsKKwkJYXR0cl90ZXh0Ym94ID0gQV9OT1JNQUw7CisJCWF0dHJfdGV4dGZpZWxkID0gQV9SRVZFUlNFOworCQlhdHRyX21lbnUgPSBBX05PUk1BTDsKKwkJYXR0cl9tZW51X3NlbGVjdGVkID0gQV9SRVZFUlNFOworCX0KK30KZGlmZiAtLWdpdCBhL2Fsc2FtaXhlci9jb2xvcnMuaCBiL2Fsc2FtaXhlci9jb2xvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mzk2MDA0Ci0tLSAvZGV2L251bGwKKysrIGIvYWxzYW1peGVyL2NvbG9ycy5oCkBAIC0wLDAgKzEsMzMgQEAKKyNpZm5kZWYgQ09MT1JTX0hfSU5DTFVERUQKKyNkZWZpbmUgQ09MT1JTX0hfSU5DTFVERUQKKworI2RlZmluZSBUUklDT0xPUl9WT0xVTUVfQkFSCisKK2V4dGVybiBpbnQgYXR0cl9taXhlcl9mcmFtZTsKK2V4dGVybiBpbnQgYXR0cl9taXhlcl90ZXh0OworZXh0ZXJuIGludCBhdHRyX21peGVyX2FjdGl2ZTsKK2V4dGVybiBpbnQgYXR0cl9jdGxfZnJhbWU7CitleHRlcm4gaW50IGF0dHJfY3RsX211dGU7CitleHRlcm4gaW50IGF0dHJfY3RsX25vbXV0ZTsKK2V4dGVybiBpbnQgYXR0cl9jdGxfY2FwdHVyZTsKK2V4dGVybiBpbnQgYXR0cl9jdGxfbm9jYXB0dXJlOworZXh0ZXJuIGludCBhdHRyX2N0bF9sYWJlbDsKK2V4dGVybiBpbnQgYXR0cl9jdGxfbGFiZWxfZm9jdXM7CitleHRlcm4gaW50IGF0dHJfY3RsX21hcmtfZm9jdXM7CitleHRlcm4gaW50IGF0dHJfY3RsX2Jhcl9sbzsKKyNpZmRlZiBUUklDT0xPUl9WT0xVTUVfQkFSCitleHRlcm4gaW50IGF0dHJfY3RsX2Jhcl9taTsKK2V4dGVybiBpbnQgYXR0cl9jdGxfYmFyX2hpOworI2VuZGlmCitleHRlcm4gaW50IGF0dHJfY3RsX2luYWN0aXZlOworZXh0ZXJuIGludCBhdHRyX2N0bF9sYWJlbF9pbmFjdGl2ZTsKK2V4dGVybiBpbnQgYXR0cl9lcnJvcm1zZzsKK2V4dGVybiBpbnQgYXR0cl9pbmZvbXNnOworZXh0ZXJuIGludCBhdHRyX3RleHRib3g7CitleHRlcm4gaW50IGF0dHJfdGV4dGZpZWxkOworZXh0ZXJuIGludCBhdHRyX21lbnU7CitleHRlcm4gaW50IGF0dHJfbWVudV9zZWxlY3RlZDsKKwordm9pZCBpbml0X2NvbG9ycyhpbnQgdXNlX2NvbG9yKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbHNhbWl4ZXIvZGV2aWNlX25hbWUuYyBiL2Fsc2FtaXhlci9kZXZpY2VfbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1OGU2NTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbHNhbWl4ZXIvZGV2aWNlX25hbWUuYwpAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIGRldmljZV9uYW1lX2Zvcm0uYyAtIGFzayBmb3Igc291bmQgY29udHJvbCBkZXZpY2UgbmFtZQorICogQ29weXJpZ2h0IChjKSBDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJhY29uZmlnLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSBDVVJTRVNJTkMKKyNpbmNsdWRlIDxmb3JtLmg+CisjaW5jbHVkZSAiZ2V0dGV4dF9jdXJzZXMuaCIKKyNpbmNsdWRlICJkaWUuaCIKKyNpbmNsdWRlICJtZW0uaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImNvbG9ycy5oIgorI2luY2x1ZGUgIndpZGdldC5oIgorI2luY2x1ZGUgIm1peGVyX3dpZGdldC5oIgorI2luY2x1ZGUgImNhcmRfc2VsZWN0LmgiCisjaW5jbHVkZSAiZGV2aWNlX25hbWUuaCIKKworc3RhdGljIHN0cnVjdCB3aWRnZXQgZm9ybV93aWRnZXQ7CitzdGF0aWMgRklFTEQgKmZpZWxkc1szXTsKK3N0YXRpYyBGT1JNICpmb3JtOworCitzdGF0aWMgY2hhciAqZHVwX2N1cnJlbnRfbmFtZSh2b2lkKQoreworCWludCByb3dzLCBjb2xzLCBtYXgsIGk7CisJY2hhciAqczsKKworCWlmIChmb3JtX2RyaXZlcihmb3JtLCBSRVFfVkFMSURBVElPTikgPT0gRV9PSykgeworCQlkeW5hbWljX2ZpZWxkX2luZm8oZmllbGRzWzFdLCAmcm93cywgJmNvbHMsICZtYXgpOworCQlzID0gY2NhbGxvYygxLCBjb2xzICsgMSk7CisJCW1lbWNweShzLCBmaWVsZF9idWZmZXIoZmllbGRzWzFdLCAwKSwgY29scyk7CisJCWZvciAoaSA9IHN0cmxlbihzKSAtIDE7IGkgPj0gMCAmJiBzW2ldID09ICcgJzsgLS1pKQorCQkJc1tpXSA9ICdcMCc7CisJCXJldHVybiBzOworCX0gZWxzZSB7CisJCXJldHVybiBjc3RyZHVwKCIiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9uX2tleV9lbnRlcih2b2lkKQoreworCWNoYXIgKnM7CisJYm9vbCBvazsKKworCXMgPSBkdXBfY3VycmVudF9uYW1lKCk7CisJb2sgPSBzZWxlY3RfY2FyZF9ieV9uYW1lKHMpOworCWZyZWUocyk7CisJaWYgKG9rKSB7CisJCWZvcm1fd2lkZ2V0LmNsb3NlKCk7CisJCWNsb3NlX2NhcmRfc2VsZWN0X2xpc3QoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9uX2Zvcm1fa2V5KGludCBrZXkpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJCWludCBrZXk7CisJCWludCByZXF1ZXN0OworCX0ga2V5X21hcFtdID0geworCQl7IEtFWV9MRUZULCBSRVFfUFJFVl9DSEFSIH0sCisJCXsgS0VZX1JJR0hULCBSRVFfTkVYVF9DSEFSIH0sCisJCXsgS0VZX0hPTUUsIFJFUV9CRUdfRklFTEQgfSwKKwkJeyBLRVlfQkFDS1NQQUNFLCBSRVFfREVMX1BSRVYgfSwKKwkJeyBLRVlfREMsIFJFUV9ERUxfQ0hBUiB9LAorCQl7IEtFWV9CRUcsIFJFUV9CRUdfRklFTEQgfSwKKwkJeyBLRVlfRU5ELCBSRVFfRU5EX0ZJRUxEIH0sCisJfTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChrZXkgPj0gMzIgJiYga2V5IDwgMjU2KSB7CisJCWZvcm1fZHJpdmVyKGZvcm0sIGtleSk7CisJCXJldHVybjsKKwl9CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoa2V5X21hcCk7ICsraSkKKwkJaWYgKGtleV9tYXBbaV0ua2V5ID09IGtleSkgeworCQkJZm9ybV9kcml2ZXIoZm9ybSwga2V5X21hcFtpXS5yZXF1ZXN0KTsKKwkJCWJyZWFrOworCQl9Cit9CisKK3N0YXRpYyB2b2lkIG9uX2hhbmRsZV9rZXkoaW50IGtleSkKK3sKKwlzd2l0Y2ggKGtleSkgeworCWNhc2UgMjc6CisJY2FzZSBLRVlfQ0FOQ0VMOgorCQlmb3JtX3dpZGdldC5jbG9zZSgpOworCQlicmVhazsKKwljYXNlIDEwOgorCWNhc2UgMTM6CisJY2FzZSBLRVlfRU5URVI6CisJCW9uX2tleV9lbnRlcigpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlvbl9mb3JtX2tleShrZXkpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBib29sIGNyZWF0ZSh2b2lkKQoreworCWNvbnN0IGNoYXIgKnRpdGxlOworCisJaWYgKHNjcmVlbl9saW5lcyA8IDYgfHwgc2NyZWVuX2NvbHMgPCAzNikgeworCQlmb3JtX3dpZGdldC5jbG9zZSgpOworCQliZWVwKCk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJd2lkZ2V0X2luaXQoJmZvcm1fd2lkZ2V0LAorCQkgICAgNiwgMzYsIFNDUkVFTl9DRU5URVIsIFNDUkVFTl9DRU5URVIsCisJCSAgICBhdHRyX3RleHRib3gsIFdJREdFVF9CT1JERVIgfCBXSURHRVRfU1VCV0lORE9XIHwgV0lER0VUX0NVUlNPUl9WSVNJQkxFKTsKKwl0aXRsZSA9IF8oIlNvdW5kIENhcmQiKTsKKwltdndwcmludHcoZm9ybV93aWRnZXQud2luZG93LCAwLCAoMzYgLSAyIC0gZ2V0X21ic193aWR0aCh0aXRsZSkpIC8gMiwgIiAlcyAiLCB0aXRsZSk7CisKKwlzZXRfZm9ybV93aW4oZm9ybSwgZm9ybV93aWRnZXQud2luZG93KTsKKwlzZXRfZm9ybV9zdWIoZm9ybSwgZm9ybV93aWRnZXQuc3Vid2luZG93KTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQgb25fd2luZG93X3NpemVfY2hhbmdlZCh2b2lkKQoreworCWZvcm1fZHJpdmVyKGZvcm0sIFJFUV9WQUxJREFUSU9OKTsgLyogc2F2ZSBmaWVsZCB2YWx1ZSAqLworCXVucG9zdF9mb3JtKGZvcm0pOworCisJaWYgKCFjcmVhdGUoKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBUaGlzIGNhbGwgZmFpbHMgYmVjYXVzZSBuY3Vyc2VzIGRvZXMgbm90IGFsbG93IGNoYW5naW5nIG9wdGlvbnMgb2YKKwkgKiB0aGUgY3VycmVudCBmaWVsZCwgYW5kIHdlIGNhbm5vdCBjaGFuZ2UgdGhlIGN1cnJlbnQgZmllbGQgYmVjYXVzZQorCSAqIHRoZXJlIGlzIG9ubHkgb25lLiAgVGhlIG9ubHkgd2F5IHRvIG1ha2UgdGhpcyB3b3JrIHdvdWxkIGJlIHRvIHRocm93CisJICogYXdheSBhbmQgcmVjcmVhdGUgYWxsIGZpZWxkcy4KKwkgKi8KKwlmaWVsZF9vcHRzX29mZihmaWVsZHNbMV0sIE9fQkxBTkspOworCisJcG9zdF9mb3JtKGZvcm0pOworfQorCitzdGF0aWMgdm9pZCBvbl9jbG9zZSh2b2lkKQoreworCXVucG9zdF9mb3JtKGZvcm0pOworCWZyZWVfZm9ybShmb3JtKTsKKwlmcmVlX2ZpZWxkKGZpZWxkc1swXSk7CisJZnJlZV9maWVsZChmaWVsZHNbMV0pOworCXdpZGdldF9mcmVlKCZmb3JtX3dpZGdldCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgd2lkZ2V0IGZvcm1fd2lkZ2V0ID0geworCS5oYW5kbGVfa2V5ID0gb25faGFuZGxlX2tleSwKKwkud2luZG93X3NpemVfY2hhbmdlZCA9IG9uX3dpbmRvd19zaXplX2NoYW5nZWQsCisJLmNsb3NlID0gb25fY2xvc2UsCit9OworCit2b2lkIGNyZWF0ZV9kZXZpY2VfbmFtZV9mb3JtKHZvaWQpCit7CisJZmllbGRzWzBdID0gbmV3X2ZpZWxkKDEsIDMyLCAxLCAxLCAwLCAwKTsKKwlpZiAoIWZpZWxkc1swXSkKKwkJZmF0YWxfZXJyb3IoImNhbm5vdCBjcmVhdGUgZmllbGQiKTsKKwlmaWVsZF9vcHRzX29mZihmaWVsZHNbMF0sIE9fQUNUSVZFKTsKKwlmaWVsZF9vcHRzX29mZihmaWVsZHNbMF0sIE9fRURJVCk7CisJc2V0X2ZpZWxkX2ZvcmUoZmllbGRzWzBdLCBhdHRyX3RleHRib3gpOworCXNldF9maWVsZF9iYWNrKGZpZWxkc1swXSwgYXR0cl90ZXh0Ym94KTsKKwlzZXRfZmllbGRfYnVmZmVyKGZpZWxkc1swXSwgMCwgXygiRGV2aWNlIG5hbWU6IikpOworCisJZmllbGRzWzFdID0gbmV3X2ZpZWxkKDEsIDMyLCAyLCAxLCAwLCAwKTsKKwlpZiAoIWZpZWxkc1sxXSkKKwkJZmF0YWxfZXJyb3IoImNhbm5vdCBjcmVhdGUgZmllbGQiKTsKKwlmaWVsZF9vcHRzX29mZihmaWVsZHNbMV0sIE9fQVVUT1NLSVApOworCWZpZWxkX29wdHNfb2ZmKGZpZWxkc1sxXSwgT19OVUxMT0spOworCWZpZWxkX29wdHNfb2ZmKGZpZWxkc1sxXSwgT19TVEFUSUMpOworCXNldF9maWVsZF9mb3JlKGZpZWxkc1sxXSwgYXR0cl90ZXh0ZmllbGQpOworCXNldF9maWVsZF9iYWNrKGZpZWxkc1sxXSwgYXR0cl90ZXh0ZmllbGQpOworCXNldF9maWVsZF9idWZmZXIoZmllbGRzWzFdLCAwLCBtaXhlcl9kZXZpY2VfbmFtZSk7CisKKwlmb3JtID0gbmV3X2Zvcm0oZmllbGRzKTsKKwlpZiAoIWZvcm0pCisJCWZhdGFsX2Vycm9yKCJjYW5ub3QgY3JlYXRlIGZvcm0iKTsKKworCWlmICghY3JlYXRlKCkpCisJCXJldHVybjsKKworCXBvc3RfZm9ybShmb3JtKTsKK30KZGlmZiAtLWdpdCBhL2Fsc2FtaXhlci9kZXZpY2VfbmFtZS5oIGIvYWxzYW1peGVyL2RldmljZV9uYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRhMWYzZgotLS0gL2Rldi9udWxsCisrKyBiL2Fsc2FtaXhlci9kZXZpY2VfbmFtZS5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBERVZJQ0VfTkFNRV9GT1JNX0hfSU5DTFVERUQKKyNkZWZpbmUgREVWSUNFX05BTUVfRk9STV9IX0lOQ0xVREVECisKK3ZvaWQgY3JlYXRlX2RldmljZV9uYW1lX2Zvcm0odm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYWxzYW1peGVyL2RpZS5jIGIvYWxzYW1peGVyL2RpZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OWE1MDEKLS0tIC9kZXYvbnVsbAorKysgYi9hbHNhbWl4ZXIvZGllLmMKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIGRpZS5jIC0gZXJyb3IgaGFuZGxlcnMKKyAqIENvcHlyaWdodCAoYykgQ2xlbWVucyBMYWRpc2NoIDxjbGVtZW5zQGxhZGlzY2guZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAiYWNvbmZpZy5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YWxzYS9hc291bmRsaWIuaD4KKyNpbmNsdWRlICJnZXR0ZXh0X2N1cnNlcy5oIgorI2luY2x1ZGUgIm1haW5sb29wLmgiCisjaW5jbHVkZSAiZGllLmgiCisKK3ZvaWQgZmF0YWxfZXJyb3IoY29uc3QgY2hhciAqbXNnKQoreworCWFwcF9zaHV0ZG93bigpOworCWZwcmludGYoc3RkZXJyLCAiJXNcbiIsIG1zZyk7CisJZXhpdChFWElUX0ZBSUxVUkUpOworfQorCit2b2lkIGZhdGFsX2Fsc2FfZXJyb3IoY29uc3QgY2hhciAqbXNnLCBpbnQgZXJyKQoreworCWFwcF9zaHV0ZG93bigpOworCWZwcmludGYoc3RkZXJyLCBfKCIlczogJXNcbiIpLCBtc2csIHNuZF9zdHJlcnJvcihlcnIpKTsKKwlleGl0KEVYSVRfRkFJTFVSRSk7Cit9CmRpZmYgLS1naXQgYS9hbHNhbWl4ZXIvZGllLmggYi9hbHNhbWl4ZXIvZGllLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzllZjFjMAotLS0gL2Rldi9udWxsCisrKyBiL2Fsc2FtaXhlci9kaWUuaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgRElFX0hfSU5DTFVERUQKKyNkZWZpbmUgRElFX0hfSU5DTFVERUQKKwordm9pZCBmYXRhbF9lcnJvcihjb25zdCBjaGFyICptc2cpIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOwordm9pZCBmYXRhbF9hbHNhX2Vycm9yKGNvbnN0IGNoYXIgKm1zZywgaW50IGVycikgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYWxzYW1peGVyL2dvIGIvYWxzYW1peGVyL2dvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMzM2MyOTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbHNhbWl4ZXIvZ28KQEAgLTAsMCArMSwxMCBAQAorIyEvYmluL2Jhc2gKKworI0dEQj0iZ2RiIC0tYXJncyIKK0dEQj0iIgorCitBTFNBX01JWEVSX1NJTVBMRV9NT0RVTEVTPSIkSE9NRS9oZy9hbHNhLWxpYi9tb2R1bGVzL21peGVyL3NpbXBsZS8ubGlicyIgXAorQUxTQV9NSVhFUl9TSU1QTEU9IiRIT01FL2hnL2Fsc2EtbGliL3NyYy9jb25mL3NtaXhlci5jb25mIiBcCitBTFNBX01JWEVSX1NJTVBMRV9NUFlUSE9OPSIkSE9NRS9oZy9hbHNhLWxpYi9tb2R1bGVzL21peGVyL3NpbXBsZS9weXRob24vbWFpbi5weSIgXAorTERfUFJFTE9BRD0iJEhPTUUvaGcvYWxzYS1saWIvc3JjLy5saWJzL2xpYmFzb3VuZC5zbyIgXAorJEdEQiAuL2Fsc2FtaXhlciAiJEAiCmRpZmYgLS1naXQgYS9hbHNhbWl4ZXIvbWFpbmxvb3AuYyBiL2Fsc2FtaXhlci9tYWlubG9vcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZmVmOWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbHNhbWl4ZXIvbWFpbmxvb3AuYwpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIG1haW5sb29wLmMgLSBtYWluIGxvb3AKKyAqIENvcHlyaWdodCAoYykgQ2xlbWVucyBMYWRpc2NoIDxjbGVtZW5zQGxhZGlzY2guZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAiYWNvbmZpZy5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxwb2xsLmg+CisjaW5jbHVkZSA8cGFuZWwuaD4KKyNpbmNsdWRlIDxhbHNhL2Fzb3VuZGxpYi5oPgorI2luY2x1ZGUgIm1lbS5oIgorI2luY2x1ZGUgImRpZS5oIgorI2luY2x1ZGUgImNvbG9ycy5oIgorI2luY2x1ZGUgIndpZGdldC5oIgorI2luY2x1ZGUgIm1peGVyX3dpZGdldC5oIgorI2luY2x1ZGUgIm1peGVyX2Rpc3BsYXkuaCIKKyNpbmNsdWRlICJtYWlubG9vcC5oIgorCitzdGF0aWMgV0lORE9XICpjdXJzZXNfaW5pdGlhbGl6ZWQ7CisKK3N0YXRpYyB2b2lkIGJsYWNrX2hvbGVfZXJyb3JfaGFuZGxlcihjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBpbnQgZXJyLAorCQkJCSAgICAgY29uc3QgY2hhciAqZm10LCAuLi4pCit7Cit9CisKK3ZvaWQgaW5pdGlhbGl6ZV9jdXJzZXMoYm9vbCB1c2VfY29sb3IpCit7CisJY3Vyc2VzX2luaXRpYWxpemVkID0gaW5pdHNjcigpOworCWNicmVhaygpOworCW5vZWNobygpOworI2lmZGVmIEhBVkVfQ1VSU0VTX0VTQ0RFTEFZCisJc2V0X2VzY2RlbGF5KDEwMCk7CisjZW5kaWYKKwl3aW5kb3dfc2l6ZV9jaGFuZ2VkKCk7IC8qIHVwZGF0ZSBzY3JlZW5fbGluZXMvY29scyAqLworCWluaXRfY29sb3JzKHVzZV9jb2xvcik7CisJc25kX2xpYl9lcnJvcl9zZXRfaGFuZGxlcihibGFja19ob2xlX2Vycm9yX2hhbmRsZXIpOworfQorCit2b2lkIGFwcF9zaHV0ZG93bih2b2lkKQoreworCWlmIChjdXJzZXNfaW5pdGlhbGl6ZWQpIHsKKwkJY2xlYXIoKTsKKwkJcmVmcmVzaCgpOworCQljdXJzX3NldCgxKTsKKwkJZW5kd2luKCk7CisJfQorCW1peGVyX3NodXRkb3duKCk7Cit9CisKK3ZvaWQgbWFpbmxvb3Aodm9pZCkKK3sKKwlzdHJ1Y3QgcG9sbGZkICpwb2xsZmRzID0gTlVMTDsKKwlpbnQgbmZkcyA9IDAsIG47CisJc3RydWN0IHdpZGdldCAqYWN0aXZlX3dpZGdldDsKKwl1bnNpZ25lZCBzaG9ydCByZXZlbnRzOworCWludCBrZXk7CisJaW50IGVycjsKKworCWZvciAoOzspIHsKKwkJdXBkYXRlX3BhbmVscygpOworCQlkb3VwZGF0ZSgpOworCisJCWFjdGl2ZV93aWRnZXQgPSBnZXRfYWN0aXZlX3dpZGdldCgpOworCQlpZiAoIWFjdGl2ZV93aWRnZXQpCisJCQlicmVhazsKKworCQluID0gMSArIHNuZF9taXhlcl9wb2xsX2Rlc2NyaXB0b3JzX2NvdW50KG1peGVyKTsKKwkJaWYgKG4gIT0gbmZkcykgeworCQkJZnJlZShwb2xsZmRzKTsKKwkJCW5mZHMgPSBuOworCQkJcG9sbGZkcyA9IGNjYWxsb2MobmZkcywgc2l6ZW9mICpwb2xsZmRzKTsKKwkJCXBvbGxmZHNbMF0uZmQgPSBmaWxlbm8oc3RkaW4pOworCQkJcG9sbGZkc1swXS5ldmVudHMgPSBQT0xMSU47CisJCX0KKwkJZXJyID0gc25kX21peGVyX3BvbGxfZGVzY3JpcHRvcnMobWl4ZXIsICZwb2xsZmRzWzFdLCBuZmRzIC0gMSk7CisJCWlmIChlcnIgPCAwKQorCQkJZmF0YWxfYWxzYV9lcnJvcigiY2Fubm90IGdldCBwb2xsIGRlc2NyaXB0b3JzIiwgZXJyKTsKKwkJbiA9IHBvbGwocG9sbGZkcywgbmZkcywgLTEpOworCQlpZiAobiA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFSU5UUikgeworCQkJCXBvbGxmZHNbMF0ucmV2ZW50cyA9IDA7CisJCQkJZG91cGRhdGUoKTsgLyogaGFuZGxlIFNJR1dJTkNIICovCisJCQl9IGVsc2UgeworCQkJCWZhdGFsX2Vycm9yKCJwb2xsIGVycm9yIik7CisJCQl9CisJCX0KKwkJaWYgKHBvbGxmZHNbMF0ucmV2ZW50cyAmIChQT0xMRVJSIHwgUE9MTEhVUCB8IFBPTExOVkFMKSkKKwkJCWJyZWFrOworCQlpZiAocG9sbGZkc1swXS5yZXZlbnRzICYgUE9MTElOKQorCQkJLS1uOworCQlpZiAobiA+IDApIHsKKwkJCWVyciA9IHNuZF9taXhlcl9wb2xsX2Rlc2NyaXB0b3JzX3JldmVudHMobWl4ZXIsICZwb2xsZmRzWzFdLCBuZmRzIC0gMSwgJnJldmVudHMpOworCQkJaWYgKGVyciA8IDApCisJCQkJZmF0YWxfYWxzYV9lcnJvcigiY2Fubm90IGdldCBwb2xsIGV2ZW50cyIsIGVycik7CisJCQlpZiAocmV2ZW50cyAmIChQT0xMRVJSIHwgUE9MTE5WQUwpKQorCQkJCWNsb3NlX21peGVyX2RldmljZSgpOworCQkJZWxzZSBpZiAocmV2ZW50cyAmIFBPTExJTikKKwkJCQlzbmRfbWl4ZXJfaGFuZGxlX2V2ZW50cyhtaXhlcik7CisJCX0KKwkJa2V5ID0gd2dldGNoKGFjdGl2ZV93aWRnZXQtPndpbmRvdyk7CisJCXdoaWxlIChrZXkgIT0gRVJSKSB7CisjaWZkZWYgS0VZX1JFU0laRQorCQkJaWYgKGtleSA9PSBLRVlfUkVTSVpFKQorCQkJCXdpbmRvd19zaXplX2NoYW5nZWQoKTsKKwkJCWVsc2UKKyNlbmRpZgorCQkJCWFjdGl2ZV93aWRnZXQtPmhhbmRsZV9rZXkoa2V5KTsKKwkJCWFjdGl2ZV93aWRnZXQgPSBnZXRfYWN0aXZlX3dpZGdldCgpOworCQkJaWYgKCFhY3RpdmVfd2lkZ2V0KQorCQkJCWJyZWFrOworCQkJa2V5ID0gd2dldGNoKGFjdGl2ZV93aWRnZXQtPndpbmRvdyk7CisJCX0KKwkJaWYgKCFhY3RpdmVfd2lkZ2V0KQorCQkJYnJlYWs7CisJCWlmIChjb250cm9sc19jaGFuZ2VkKQorCQkJZGlzcGxheV9jb250cm9scygpOworCX0KKwlmcmVlKHBvbGxmZHMpOworfQpkaWZmIC0tZ2l0IGEvYWxzYW1peGVyL21haW5sb29wLmggYi9hbHNhbWl4ZXIvbWFpbmxvb3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjMxN2JlCi0tLSAvZGV2L251bGwKKysrIGIvYWxzYW1peGVyL21haW5sb29wLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBNQUlOTE9PUF9IX0lOQ0xVREVECisjZGVmaW5lIE1BSU5MT09QX0hfSU5DTFVERUQKKworI2luY2x1ZGUgQ1VSU0VTSU5DCisKK3ZvaWQgaW5pdGlhbGl6ZV9jdXJzZXMoYm9vbCB1c2VfY29sb3IpOwordm9pZCBtYWlubG9vcCh2b2lkKTsKK3ZvaWQgYXBwX3NodXRkb3duKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2Fsc2FtaXhlci9tZW0uYyBiL2Fsc2FtaXhlci9tZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzYTg5Ci0tLSAvZGV2L251bGwKKysrIGIvYWxzYW1peGVyL21lbS5jCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBtZW0uYyAtIG1lbW9yeSBhbGxvY2F0aW9uIGNoZWNrZXJzCisgKiBDb3B5cmlnaHQgKGMpIENsZW1lbnMgTGFkaXNjaCA8Y2xlbWVuc0BsYWRpc2NoLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2RlZmluZSBfR05VX1NPVVJDRQorI2luY2x1ZGUgImFjb25maWcuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSAiZGllLmgiCisjaW5jbHVkZSAibWVtLmgiCisKK3N0YXRpYyB2b2lkIGNoZWNrKHZvaWQgKnApCit7CisJaWYgKCFwKQorCQlmYXRhbF9lcnJvcigib3V0IG9mIG1lbW9yeSIpOworfQorCit2b2lkICpjY2FsbG9jKHNpemVfdCBuLCBzaXplX3Qgc2l6ZSkKK3sKKwl2b2lkICptZW0gPSBjYWxsb2Mobiwgc2l6ZSk7CisJaWYgKG4gJiYgc2l6ZSkKKwkJY2hlY2sobWVtKTsKKwlyZXR1cm4gbWVtOworfQorCit2b2lkICpjcmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBuZXdfc2l6ZSkKK3sKKwlwdHIgPSByZWFsbG9jKHB0ciwgbmV3X3NpemUpOworCWlmIChuZXdfc2l6ZSkKKwkJY2hlY2socHRyKTsKKwlyZXR1cm4gcHRyOworfQorCitjaGFyICpjc3RyZHVwKGNvbnN0IGNoYXIgKnMpCit7CisJY2hhciAqc3RyID0gc3RyZHVwKHMpOworCWNoZWNrKHN0cik7CisJcmV0dXJuIHN0cjsKK30KKworY2hhciAqY2FzcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisJY2hhciAqc3RyOworCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJaWYgKHZhc3ByaW50Zigmc3RyLCBmbXQsIGFwKSA8IDApCisJCWNoZWNrKE5VTEwpOworCXZhX2VuZChhcCk7CisJcmV0dXJuIHN0cjsKK30KZGlmZiAtLWdpdCBhL2Fsc2FtaXhlci9tZW0uaCBiL2Fsc2FtaXhlci9tZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGU1ZjU0Ci0tLSAvZGV2L251bGwKKysrIGIvYWxzYW1peGVyL21lbS5oCkBAIC0wLDAgKzEsMTEgQEAKKyNpZm5kZWYgTUVNX0hfSU5DTFVERUQKKyNkZWZpbmUgTUVNX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCit2b2lkICpjY2FsbG9jKHNpemVfdCBuLCBzaXplX3Qgc2l6ZSk7Cit2b2lkICpjcmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBuZXdfc2l6ZSk7CitjaGFyICpjc3RyZHVwKGNvbnN0IGNoYXIgKnMpOworY2hhciAqY2FzcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fKChfX2Zvcm1hdF9fKHByaW50ZiwgMSwgMikpKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbHNhbWl4ZXIvbWl4ZXJfY29udHJvbHMuYyBiL2Fsc2FtaXhlci9taXhlcl9jb250cm9scy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjOThiNjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbHNhbWl4ZXIvbWl4ZXJfY29udHJvbHMuYwpAQCAtMCwwICsxLDUyMSBAQAorLyoKKyAqIG1peGVyX2NvbnRyb2xzLmMgLSBoYW5kbGVzIG1peGVyIGNvbnRyb2xzIGFuZCBtYXBwaW5nIGZyb20gc2VsZW1zCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgsMTk5OSBUaW0gSmFuaWsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgICAgICBDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJhY29uZmlnLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSBDVVJTRVNJTkMKKyNpbmNsdWRlIDxhbHNhL2Fzb3VuZGxpYi5oPgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAibWVtLmgiCisjaW5jbHVkZSAibWl4ZXJfZGlzcGxheS5oIgorI2luY2x1ZGUgIm1peGVyX3dpZGdldC5oIgorI2luY2x1ZGUgIm1peGVyX2NvbnRyb2xzLmgiCisKK3N0cnVjdCBjb250cm9sICpjb250cm9sczsKK3Vuc2lnbmVkIGludCBjb250cm9sc19jb3VudDsKKworc3RhdGljIGNvbnN0IHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3Qgc3VwcG9ydGVkX2NoYW5uZWxzW10gPSB7CisJU05EX01JWEVSX1NDSE5fRlJPTlRfTEVGVCwKKwlTTkRfTUlYRVJfU0NITl9GUk9OVF9SSUdIVCwKKwlTTkRfTUlYRVJfU0NITl9SRUFSX0xFRlQsCisJU05EX01JWEVSX1NDSE5fUkVBUl9SSUdIVCwKKwlTTkRfTUlYRVJfU0NITl9GUk9OVF9DRU5URVIsCisJU05EX01JWEVSX1NDSE5fV09PRkVSLAorCVNORF9NSVhFUl9TQ0hOX1NJREVfTEVGVCwKKwlTTkRfTUlYRVJfU0NITl9TSURFX1JJR0hULAorfTsKKyNkZWZpbmUgTEFTVF9TVVBQT1JURURfQ0hBTk5FTCBTTkRfTUlYRVJfU0NITl9TSURFX1JJR0hUCisKK3N0YXRpYyBjb25zdCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNvbnRyb2xfY2hhbm5lbHNbXVsyXSA9IHsKKwl7IFNORF9NSVhFUl9TQ0hOX0ZST05UX0xFRlQsIFNORF9NSVhFUl9TQ0hOX0ZST05UX1JJR0hUIH0sCisJeyBTTkRfTUlYRVJfU0NITl9SRUFSX0xFRlQsIFNORF9NSVhFUl9TQ0hOX1JFQVJfUklHSFQgfSwKKwl7IFNORF9NSVhFUl9TQ0hOX0ZST05UX0NFTlRFUiwgU05EX01JWEVSX1NDSE5fVU5LTk9XTiB9LAorCXsgU05EX01JWEVSX1NDSE5fV09PRkVSLCBTTkRfTUlYRVJfU0NITl9VTktOT1dOIH0sCisJeyBTTkRfTUlYRVJfU0NITl9TSURFX0xFRlQsIFNORF9NSVhFUl9TQ0hOX1NJREVfUklHSFQgfSwKK307CisKK2Jvb2wgYXJlX3RoZXJlX2FueV9jb250cm9scyh2b2lkKQoreworCXNuZF9taXhlcl9lbGVtX3QgKmVsZW07CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGVsZW0gPSBzbmRfbWl4ZXJfZmlyc3RfZWxlbShtaXhlcik7CisJICAgICBlbGVtOworCSAgICAgZWxlbSA9IHNuZF9taXhlcl9lbGVtX25leHQoZWxlbSkpIHsKKwkJaWYgKHNuZF9taXhlcl9lbGVtX2dldF90eXBlKGVsZW0pICE9IFNORF9NSVhFUl9FTEVNX1NJTVBMRSkKKwkJCWNvbnRpbnVlOworCQlpZiAoc25kX21peGVyX3NlbGVtX2lzX2VudW1lcmF0ZWQoZWxlbSkpCisJCQlyZXR1cm4gVFJVRTsKKwkJaWYgKHNuZF9taXhlcl9zZWxlbV9oYXNfcGxheWJhY2tfdm9sdW1lX2pvaW5lZChlbGVtKSB8fAorCQkgICAgc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3ZvbHVtZV9qb2luZWQoZWxlbSkgfHwKKwkJICAgIHNuZF9taXhlcl9zZWxlbV9oYXNfcGxheWJhY2tfc3dpdGNoX2pvaW5lZChlbGVtKSB8fAorCQkgICAgc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3N3aXRjaF9qb2luZWQoZWxlbSkpCisJCQlyZXR1cm4gVFJVRTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3VwcG9ydGVkX2NoYW5uZWxzKTsgKytpKQorCQkJaWYgKHNuZF9taXhlcl9zZWxlbV9oYXNfcGxheWJhY2tfY2hhbm5lbChlbGVtLCBzdXBwb3J0ZWRfY2hhbm5lbHNbaV0pIHx8CisJCQkgICAgc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX2NoYW5uZWwoZWxlbSwgc3VwcG9ydGVkX2NoYW5uZWxzW2ldKSkKKwkJCQlyZXR1cm4gVFJVRTsKKwl9CisJcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgYm9vbCBoYXNfbW9yZV90aGFuX2Zyb250X2NhcHR1cmVfY2hhbm5lbHMoc25kX21peGVyX2VsZW1fdCAqZWxlbSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDI7IGkgPCBBUlJBWV9TSVpFKHN1cHBvcnRlZF9jaGFubmVscyk7ICsraSkKKwkJaWYgKHNuZF9taXhlcl9zZWxlbV9oYXNfY2FwdHVyZV9jaGFubmVsKGVsZW0sIHN1cHBvcnRlZF9jaGFubmVsc1tpXSkpCisJCQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBib29sIGhhc19hbnlfY29udHJvbF9jaGFubmVsKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sCisJCQkJICAgIGNvbnN0IHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgY2hhbm5lbHNbMl0sCisJCQkJICAgIGludCAoKmhhc19jaGFubmVsKShzbmRfbWl4ZXJfZWxlbV90ICosIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QpKQoreworCXJldHVybiBoYXNfY2hhbm5lbChlbGVtLCBjaGFubmVsc1swXSkgfHwKKwkgICAgICAgKGNoYW5uZWxzWzFdICE9IFNORF9NSVhFUl9TQ0hOX1VOS05PV04gJiYgaGFzX2NoYW5uZWwoZWxlbSwgY2hhbm5lbHNbMV0pKTsKK30KKworc3RhdGljIGJvb2wgaGFzX21lcmdlZF9jc3dpdGNoKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pCit7CisJYm9vbCBwdm9sLCBwc3c7CisJdW5zaWduZWQgaW50IGk7CisKKwlwdm9sID0gc25kX21peGVyX3NlbGVtX2hhc19wbGF5YmFja192b2x1bWUoZWxlbSk7CisJcHN3ID0gc25kX21peGVyX3NlbGVtX2hhc19wbGF5YmFja19zd2l0Y2goZWxlbSk7CisJaWYgKChwdm9sIHx8IHBzdykgJiYKKwkgICAgc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3N3aXRjaChlbGVtKSAmJgorCSAgICAhc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3ZvbHVtZShlbGVtKSkgeworCQlpZiAoc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3N3aXRjaF9qb2luZWQoZWxlbSkpCisJCQlyZXR1cm4gVFJVRTsKKwkJZWxzZSBpZiAoKChwdm9sICYmIHNuZF9taXhlcl9zZWxlbV9oYXNfcGxheWJhY2tfdm9sdW1lX2pvaW5lZChlbGVtKSkgfHwKKwkJCSAgKHBzdyAmJiBzbmRfbWl4ZXJfc2VsZW1faGFzX3BsYXliYWNrX3N3aXRjaF9qb2luZWQoZWxlbSkpKSAmJgorCQkJIGhhc19tb3JlX3RoYW5fZnJvbnRfY2FwdHVyZV9jaGFubmVscyhlbGVtKSkKKwkJCXJldHVybiBGQUxTRTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29udHJvbF9jaGFubmVscyk7ICsraSkgeworCQkJaWYgKGhhc19hbnlfY29udHJvbF9jaGFubmVsKGVsZW0sIGNvbnRyb2xfY2hhbm5lbHNbaV0sIHNuZF9taXhlcl9zZWxlbV9oYXNfY2FwdHVyZV9jaGFubmVsKSAmJgorCQkJICAgICFoYXNfYW55X2NvbnRyb2xfY2hhbm5lbChlbGVtLCBjb250cm9sX2NoYW5uZWxzW2ldLCBzbmRfbWl4ZXJfc2VsZW1faGFzX3BsYXliYWNrX2NoYW5uZWwpKQorCQkJCXJldHVybiBGQUxTRTsKKwkJfQorCQlyZXR1cm4gVFJVRTsKKwl9CisJcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGdldF9wbGF5YmFja19jb250cm9sc19jb3VudChzbmRfbWl4ZXJfZWxlbV90ICplbGVtKQoreworCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGhhc192b2wsIGhhc19zdzsKKworCWhhc192b2wgPSBzbmRfbWl4ZXJfc2VsZW1faGFzX3BsYXliYWNrX3ZvbHVtZShlbGVtKTsKKwloYXNfc3cgPSBzbmRfbWl4ZXJfc2VsZW1faGFzX3BsYXliYWNrX3N3aXRjaChlbGVtKTsKKwlpZiAoIWhhc192b2wgJiYgIWhhc19zdykKKwkJcmV0dXJuIDA7CisJaWYgKCghaGFzX3ZvbCB8fCBzbmRfbWl4ZXJfc2VsZW1faGFzX3BsYXliYWNrX3ZvbHVtZV9qb2luZWQoZWxlbSkpICYmCisJICAgICghaGFzX3N3IHx8IHNuZF9taXhlcl9zZWxlbV9oYXNfcGxheWJhY2tfc3dpdGNoX2pvaW5lZChlbGVtKSkpCisJCXJldHVybiAxOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvbnRyb2xfY2hhbm5lbHMpOyArK2kpIHsKKwkJaWYgKHNuZF9taXhlcl9zZWxlbV9oYXNfcGxheWJhY2tfY2hhbm5lbChlbGVtLCBjb250cm9sX2NoYW5uZWxzW2ldWzBdKSB8fAorCQkgICAgKGNvbnRyb2xfY2hhbm5lbHNbaV1bMV0gIT0gU05EX01JWEVSX1NDSE5fVU5LTk9XTiAmJgorCQkgICAgIHNuZF9taXhlcl9zZWxlbV9oYXNfcGxheWJhY2tfY2hhbm5lbChlbGVtLCBjb250cm9sX2NoYW5uZWxzW2ldWzFdKSkpCisJCQkrK2NvdW50OworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X2NhcHR1cmVfY29udHJvbHNfY291bnQoc25kX21peGVyX2VsZW1fdCAqZWxlbSkKK3sKKwl1bnNpZ25lZCBpbnQgY291bnQgPSAwOworCXVuc2lnbmVkIGludCBpOworCWludCBoYXNfdm9sLCBoYXNfc3c7CisKKwloYXNfdm9sID0gc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3ZvbHVtZShlbGVtKTsKKwloYXNfc3cgPSBzbmRfbWl4ZXJfc2VsZW1faGFzX2NhcHR1cmVfc3dpdGNoKGVsZW0pOworCWlmICgoIWhhc192b2wgJiYgIWhhc19zdykgfHwKKwkgICAgKHZpZXdfbW9kZSA9PSBWSUVXX01PREVfQUxMICYmIGhhc19tZXJnZWRfY3N3aXRjaChlbGVtKSkpCisJCXJldHVybiAwOworCWlmICgoIWhhc192b2wgfHwgc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3ZvbHVtZV9qb2luZWQoZWxlbSkpICYmCisJICAgICghaGFzX3N3IHx8IHNuZF9taXhlcl9zZWxlbV9oYXNfY2FwdHVyZV9zd2l0Y2hfam9pbmVkKGVsZW0pKSkKKwkJcmV0dXJuIDE7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29udHJvbF9jaGFubmVscyk7ICsraSkgeworCQlpZiAoc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX2NoYW5uZWwoZWxlbSwgY29udHJvbF9jaGFubmVsc1tpXVswXSkgfHwKKwkJICAgIChjb250cm9sX2NoYW5uZWxzW2ldWzFdICE9IFNORF9NSVhFUl9TQ0hOX1VOS05PV04gJiYKKwkJICAgICBzbmRfbWl4ZXJfc2VsZW1faGFzX2NhcHR1cmVfY2hhbm5lbChlbGVtLCBjb250cm9sX2NoYW5uZWxzW2ldWzFdKSkpCisJCQkrK2NvdW50OworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X2NvbnRyb2xzX2NvdW50X2Zvcl9lbGVtKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pCit7CisJdW5zaWduZWQgaW50IHAsIGM7CisKKwlpZiAoc25kX21peGVyX2VsZW1fZ2V0X3R5cGUoZWxlbSkgIT0gU05EX01JWEVSX0VMRU1fU0lNUExFKQorCQlyZXR1cm4gMDsKKwlpZiAoc25kX21peGVyX3NlbGVtX2lzX2VudW1lcmF0ZWQoZWxlbSkpIHsKKwkJc3dpdGNoICh2aWV3X21vZGUpIHsKKwkJY2FzZSBWSUVXX01PREVfUExBWUJBQ0s6CisJCQlyZXR1cm4gc25kX21peGVyX3NlbGVtX2lzX2VudW1fY2FwdHVyZShlbGVtKSA/IDAgOiAxOworCQljYXNlIFZJRVdfTU9ERV9DQVBUVVJFOgorCQkJcmV0dXJuIHNuZF9taXhlcl9zZWxlbV9pc19lbnVtX2NhcHR1cmUoZWxlbSkgPyAxIDogMDsKKwkJY2FzZSBWSUVXX01PREVfQUxMOgorCQlkZWZhdWx0OgorCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJc3dpdGNoICh2aWV3X21vZGUpIHsKKwljYXNlIFZJRVdfTU9ERV9QTEFZQkFDSzoKKwkJcmV0dXJuIGdldF9wbGF5YmFja19jb250cm9sc19jb3VudChlbGVtKTsKKwljYXNlIFZJRVdfTU9ERV9DQVBUVVJFOgorCQlyZXR1cm4gZ2V0X2NhcHR1cmVfY29udHJvbHNfY291bnQoZWxlbSk7CisJY2FzZSBWSUVXX01PREVfQUxMOgorCWRlZmF1bHQ6CisJCXAgPSBnZXRfcGxheWJhY2tfY29udHJvbHNfY291bnQoZWxlbSk7CisJCWMgPSBnZXRfY2FwdHVyZV9jb250cm9sc19jb3VudChlbGVtKTsKKwkJcmV0dXJuIGhhc19tZXJnZWRfY3N3aXRjaChlbGVtKSA/IHAgOiBwICsgYzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9uYW1lKHN0cnVjdCBjb250cm9sICpjb250cm9sKQoreworCXVuc2lnbmVkIGludCBpbmRleDsKKwljaGFyICpzOworCisJaW5kZXggPSBzbmRfbWl4ZXJfc2VsZW1fZ2V0X2luZGV4KGNvbnRyb2wtPmVsZW0pOworCWlmIChpbmRleCA+IDApCisJCWNvbnRyb2wtPm5hbWUgPSBjYXNwcmludGYoIiVzICV1Iiwgc25kX21peGVyX3NlbGVtX2dldF9uYW1lKGNvbnRyb2wtPmVsZW0pLCBpbmRleCk7CisJZWxzZQorCQljb250cm9sLT5uYW1lID0gY3N0cmR1cChzbmRfbWl4ZXJfc2VsZW1fZ2V0X25hbWUoY29udHJvbC0+ZWxlbSkpOworCisJd2hpbGUgKChzID0gc3Ryc3RyKGNvbnRyb2wtPm5hbWUsICJJRUM5NTgiKSkgIT0gTlVMTCkKKwkJbWVtY3B5KHMsICJTL1BESUYiLCA2KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBjcmVhdGVfY29udHJvbHNfZm9yX2VsZW0oc25kX21peGVyX2VsZW1fdCAqZWxlbSwgc3RydWN0IGNvbnRyb2wgKmNvbnRyb2wpCit7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgbXVsdGljaF9mbGFnOworCXVuc2lnbmVkIGludCBlbnVtX2luZGV4OworCXN0cnVjdCBjb250cm9sICpmcm9udF9jb250cm9sID0gTlVMTDsKKwlib29sIGhhc19wdm9sLCBoYXNfcHN3OworCWJvb2wgaGFzX2N2b2wsIGhhc19jc3c7CisJYm9vbCBoYXNfY2hhbm5lbFtMQVNUX1NVUFBPUlRFRF9DSEFOTkVMICsgMV07CisJYm9vbCBtZXJnZWRfY3N3aXRjaDsKKwlib29sIGhhc19jaDAsIGhhc19jaDE7CisKKwlpZiAoc25kX21peGVyX2VsZW1fZ2V0X3R5cGUoZWxlbSkgIT0gU05EX01JWEVSX0VMRU1fU0lNUExFKQorCQlyZXR1cm4gMDsKKwlpZiAoc25kX21peGVyX3NlbGVtX2lzX2VudW1lcmF0ZWQoZWxlbSkpIHsKKwkJaWYgKCh2aWV3X21vZGUgPT0gVklFV19NT0RFX1BMQVlCQUNLICYmIHNuZF9taXhlcl9zZWxlbV9pc19lbnVtX2NhcHR1cmUoZWxlbSkpIHx8CisJCSAgICAodmlld19tb2RlID09IFZJRVdfTU9ERV9DQVBUVVJFICYmICFzbmRfbWl4ZXJfc2VsZW1faXNfZW51bV9jYXB0dXJlKGVsZW0pKSkKKwkJCXJldHVybiAwOworCQljb250cm9sLT5lbGVtID0gZWxlbTsKKwkJY29udHJvbC0+ZmxhZ3MgPSBUWVBFX0VOVU07CisJCWNvbnRyb2wtPmVudW1fY2hhbm5lbF9iaXRzID0gMDsKKwkJZm9yIChpID0gMDsgaSA8PSBTTkRfTUlYRVJfU0NITl9MQVNUOyArK2kpCisJCQlpZiAoc25kX21peGVyX3NlbGVtX2dldF9lbnVtX2l0ZW0oY29udHJvbC0+ZWxlbSwgKHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QpaSwgJmVudW1faW5kZXgpID49IDApCisJCQkJY29udHJvbC0+ZW51bV9jaGFubmVsX2JpdHMgfD0gMSA8PCBpOworCQlpZiAoc25kX21peGVyX3NlbGVtX2lzX2FjdGl2ZShjb250cm9sLT5lbGVtKSkKKwkJCWNvbnRyb2wtPmZsYWdzIHw9IElTX0FDVElWRTsKKwkJY3JlYXRlX25hbWUoY29udHJvbCk7CisJCXJldHVybiAxOworCX0KKwloYXNfcHZvbCA9IHNuZF9taXhlcl9zZWxlbV9oYXNfcGxheWJhY2tfdm9sdW1lKGVsZW0pOworCWhhc19wc3cgPSBzbmRfbWl4ZXJfc2VsZW1faGFzX3BsYXliYWNrX3N3aXRjaChlbGVtKTsKKwloYXNfY3ZvbCA9IHNuZF9taXhlcl9zZWxlbV9oYXNfY2FwdHVyZV92b2x1bWUoZWxlbSk7CisJaGFzX2NzdyA9IHNuZF9taXhlcl9zZWxlbV9oYXNfY2FwdHVyZV9zd2l0Y2goZWxlbSk7CisJbWVyZ2VkX2Nzd2l0Y2ggPSB2aWV3X21vZGUgPT0gVklFV19NT0RFX0FMTCAmJiBoYXNfbWVyZ2VkX2Nzd2l0Y2goZWxlbSk7CisJaWYgKHZpZXdfbW9kZSAhPSBWSUVXX01PREVfQ0FQVFVSRSAmJiAoaGFzX3B2b2wgfHwgaGFzX3BzdykpIHsKKwkJaWYgKCghaGFzX3B2b2wgfHwgc25kX21peGVyX3NlbGVtX2hhc19wbGF5YmFja192b2x1bWVfam9pbmVkKGVsZW0pKSAmJgorCQkgICAgKCFoYXNfcHN3IHx8IHNuZF9taXhlcl9zZWxlbV9oYXNfcGxheWJhY2tfc3dpdGNoX2pvaW5lZChlbGVtKSkpIHsKKwkJCWNvbnRyb2wtPmVsZW0gPSBlbGVtOworCQkJaWYgKGhhc19wdm9sKSB7CisJCQkJY29udHJvbC0+ZmxhZ3MgfD0gVFlQRV9QVk9MVU1FIHwgSEFTX1ZPTFVNRV8wOworCQkJCWNvbnRyb2wtPnZvbHVtZV9jaGFubmVsc1swXSA9IDA7CisJCQl9CisJCQlpZiAoaGFzX3BzdykgeworCQkJCWNvbnRyb2wtPmZsYWdzIHw9IFRZUEVfUFNXSVRDSCB8IEhBU19QU1dJVENIXzA7CisJCQkJY29udHJvbC0+cHN3aXRjaF9jaGFubmVsc1swXSA9IDA7CisJCQl9CisJCQlpZiAobWVyZ2VkX2Nzd2l0Y2gpIHsKKwkJCQljb250cm9sLT5mbGFncyB8PSBUWVBFX0NTV0lUQ0g7CisJCQkJaWYgKHNuZF9taXhlcl9zZWxlbV9oYXNfY2FwdHVyZV9zd2l0Y2hfam9pbmVkKGVsZW0pKSB7CisJCQkJCWNvbnRyb2wtPmZsYWdzIHw9IEhBU19DU1dJVENIXzA7CisJCQkJCWNvbnRyb2wtPmNzd2l0Y2hfY2hhbm5lbHNbMF0gPSAwOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChzbmRfbWl4ZXJfc2VsZW1faGFzX2NhcHR1cmVfY2hhbm5lbChlbGVtLCBjb250cm9sX2NoYW5uZWxzWzBdWzBdKSkgeworCQkJCQkJY29udHJvbC0+ZmxhZ3MgfD0gSEFTX0NTV0lUQ0hfMDsKKwkJCQkJCWNvbnRyb2wtPmNzd2l0Y2hfY2hhbm5lbHNbMF0gPSBjb250cm9sX2NoYW5uZWxzWzBdWzBdOworCQkJCQl9CisJCQkJCWlmIChjb250cm9sX2NoYW5uZWxzWzBdWzFdICE9IFNORF9NSVhFUl9TQ0hOX1VOS05PV04gJiYKKwkJCQkJICAgIHNuZF9taXhlcl9zZWxlbV9oYXNfY2FwdHVyZV9jaGFubmVsKGVsZW0sIGNvbnRyb2xfY2hhbm5lbHNbMF1bMV0pKSB7CisJCQkJCQljb250cm9sLT5mbGFncyB8PSBIQVNfQ1NXSVRDSF8xOworCQkJCQkJY29udHJvbC0+Y3N3aXRjaF9jaGFubmVsc1sxXSA9IGNvbnRyb2xfY2hhbm5lbHNbMF1bMV07CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKChjb250cm9sLT5mbGFncyAmIChIQVNfQ1NXSVRDSF8wIHwgSEFTX0NTV0lUQ0hfMSkpID09IEhBU19DU1dJVENIXzEpIHsKKwkJCQkJY29udHJvbC0+ZmxhZ3MgXj0gSEFTX0NTV0lUQ0hfMCB8IEhBU19DU1dJVENIXzE7CisJCQkJCWNvbnRyb2wtPmNzd2l0Y2hfY2hhbm5lbHNbMF0gPSBjb250cm9sLT5jc3dpdGNoX2NoYW5uZWxzWzFdOworCQkJCX0KKwkJCX0KKwkJCWlmIChzbmRfbWl4ZXJfc2VsZW1faXNfYWN0aXZlKGNvbnRyb2wtPmVsZW0pKQorCQkJCWNvbnRyb2wtPmZsYWdzIHw9IElTX0FDVElWRTsKKwkJCWNyZWF0ZV9uYW1lKGNvbnRyb2wpOworCQkJKytjb250cm9sOworCQkJKytjb3VudDsKKwkJfSBlbHNlIHsKKwkJCW11bHRpY2hfZmxhZyA9IDA7CisJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdXBwb3J0ZWRfY2hhbm5lbHMpOyArK2kpCisJCQkJaGFzX2NoYW5uZWxbc3VwcG9ydGVkX2NoYW5uZWxzW2ldXSA9CisJCQkJCXNuZF9taXhlcl9zZWxlbV9oYXNfcGxheWJhY2tfY2hhbm5lbChlbGVtLCBzdXBwb3J0ZWRfY2hhbm5lbHNbaV0pOworCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29udHJvbF9jaGFubmVscyk7ICsraSkgeworCQkJCWhhc19jaDAgPSBoYXNfY2hhbm5lbFtjb250cm9sX2NoYW5uZWxzW2ldWzBdXTsKKwkJCQloYXNfY2gxID0gY29udHJvbF9jaGFubmVsc1tpXVsxXSAhPSBTTkRfTUlYRVJfU0NITl9VTktOT1dOICYmCisJCQkJCWhhc19jaGFubmVsW2NvbnRyb2xfY2hhbm5lbHNbaV1bMV1dOworCQkJCWlmICghaGFzX2NoMCAmJiAhaGFzX2NoMSkKKwkJCQkJY29udGludWU7CisJCQkJY29udHJvbC0+ZWxlbSA9IGVsZW07CisJCQkJaWYgKGhhc19wdm9sKSB7CisJCQkJCWNvbnRyb2wtPmZsYWdzIHw9IFRZUEVfUFZPTFVNRTsKKwkJCQkJaWYgKHNuZF9taXhlcl9zZWxlbV9oYXNfcGxheWJhY2tfdm9sdW1lX2pvaW5lZChlbGVtKSkgeworCQkJCQkJY29udHJvbC0+ZmxhZ3MgfD0gSEFTX1ZPTFVNRV8wOworCQkJCQkJY29udHJvbC0+dm9sdW1lX2NoYW5uZWxzWzBdID0gMDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChoYXNfY2gwKSB7CisJCQkJCQkJY29udHJvbC0+ZmxhZ3MgfD0gSEFTX1ZPTFVNRV8wOworCQkJCQkJCWNvbnRyb2wtPnZvbHVtZV9jaGFubmVsc1swXSA9IGNvbnRyb2xfY2hhbm5lbHNbaV1bMF07CisJCQkJCQl9CisJCQkJCQlpZiAoaGFzX2NoMSkgeworCQkJCQkJCWNvbnRyb2wtPmZsYWdzIHw9IEhBU19WT0xVTUVfMTsKKwkJCQkJCQljb250cm9sLT52b2x1bWVfY2hhbm5lbHNbMV0gPSBjb250cm9sX2NoYW5uZWxzW2ldWzFdOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWlmIChoYXNfcHN3KSB7CisJCQkJCWNvbnRyb2wtPmZsYWdzIHw9IFRZUEVfUFNXSVRDSDsKKwkJCQkJaWYgKHNuZF9taXhlcl9zZWxlbV9oYXNfcGxheWJhY2tfc3dpdGNoX2pvaW5lZChlbGVtKSkgeworCQkJCQkJY29udHJvbC0+ZmxhZ3MgfD0gSEFTX1BTV0lUQ0hfMDsKKwkJCQkJCWNvbnRyb2wtPnBzd2l0Y2hfY2hhbm5lbHNbMF0gPSAwOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKGhhc19jaDApIHsKKwkJCQkJCQljb250cm9sLT5mbGFncyB8PSBIQVNfUFNXSVRDSF8wOworCQkJCQkJCWNvbnRyb2wtPnBzd2l0Y2hfY2hhbm5lbHNbMF0gPSBjb250cm9sX2NoYW5uZWxzW2ldWzBdOworCQkJCQkJfQorCQkJCQkJaWYgKGhhc19jaDEpIHsKKwkJCQkJCQljb250cm9sLT5mbGFncyB8PSBIQVNfUFNXSVRDSF8xOworCQkJCQkJCWNvbnRyb2wtPnBzd2l0Y2hfY2hhbm5lbHNbMV0gPSBjb250cm9sX2NoYW5uZWxzW2ldWzFdOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWlmIChtZXJnZWRfY3N3aXRjaCkgeworCQkJCQljb250cm9sLT5mbGFncyB8PSBUWVBFX0NTV0lUQ0g7CisJCQkJCWlmIChzbmRfbWl4ZXJfc2VsZW1faGFzX2NhcHR1cmVfc3dpdGNoX2pvaW5lZChlbGVtKSkgeworCQkJCQkJY29udHJvbC0+ZmxhZ3MgfD0gSEFTX0NTV0lUQ0hfMDsKKwkJCQkJCWNvbnRyb2wtPmNzd2l0Y2hfY2hhbm5lbHNbMF0gPSAwOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKHNuZF9taXhlcl9zZWxlbV9oYXNfY2FwdHVyZV9jaGFubmVsKGVsZW0sIGNvbnRyb2xfY2hhbm5lbHNbaV1bMF0pKSB7CisJCQkJCQkJY29udHJvbC0+ZmxhZ3MgfD0gSEFTX0NTV0lUQ0hfMDsKKwkJCQkJCQljb250cm9sLT5jc3dpdGNoX2NoYW5uZWxzWzBdID0gY29udHJvbF9jaGFubmVsc1tpXVswXTsKKwkJCQkJCX0KKwkJCQkJCWlmIChjb250cm9sX2NoYW5uZWxzW2ldWzFdICE9IFNORF9NSVhFUl9TQ0hOX1VOS05PV04gJiYKKwkJCQkJCSAgICBzbmRfbWl4ZXJfc2VsZW1faGFzX2NhcHR1cmVfY2hhbm5lbChlbGVtLCBjb250cm9sX2NoYW5uZWxzW2ldWzFdKSkgeworCQkJCQkJCWNvbnRyb2wtPmZsYWdzIHw9IEhBU19DU1dJVENIXzE7CisJCQkJCQkJY29udHJvbC0+Y3N3aXRjaF9jaGFubmVsc1sxXSA9IGNvbnRyb2xfY2hhbm5lbHNbaV1bMV07CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKChjb250cm9sLT5mbGFncyAmIChIQVNfVk9MVU1FXzAgfCBIQVNfVk9MVU1FXzEpKSA9PSBIQVNfVk9MVU1FXzEpIHsKKwkJCQkJY29udHJvbC0+ZmxhZ3MgXj0gSEFTX1ZPTFVNRV8wIHwgSEFTX1ZPTFVNRV8xOworCQkJCQljb250cm9sLT52b2x1bWVfY2hhbm5lbHNbMF0gPSBjb250cm9sLT52b2x1bWVfY2hhbm5lbHNbMV07CisJCQkJfQorCQkJCWlmICgoY29udHJvbC0+ZmxhZ3MgJiAoSEFTX1BTV0lUQ0hfMCB8IEhBU19QU1dJVENIXzEpKSA9PSBIQVNfUFNXSVRDSF8xKSB7CisJCQkJCWNvbnRyb2wtPmZsYWdzIF49IEhBU19QU1dJVENIXzAgfCBIQVNfUFNXSVRDSF8xOworCQkJCQljb250cm9sLT5wc3dpdGNoX2NoYW5uZWxzWzBdID0gY29udHJvbC0+cHN3aXRjaF9jaGFubmVsc1sxXTsKKwkJCQl9CisJCQkJaWYgKChjb250cm9sLT5mbGFncyAmIChIQVNfQ1NXSVRDSF8wIHwgSEFTX0NTV0lUQ0hfMSkpID09IEhBU19DU1dJVENIXzEpIHsKKwkJCQkJY29udHJvbC0+ZmxhZ3MgXj0gSEFTX0NTV0lUQ0hfMCB8IEhBU19DU1dJVENIXzE7CisJCQkJCWNvbnRyb2wtPmNzd2l0Y2hfY2hhbm5lbHNbMF0gPSBjb250cm9sLT5jc3dpdGNoX2NoYW5uZWxzWzFdOworCQkJCX0KKwkJCQlpZiAoc25kX21peGVyX3NlbGVtX2lzX2FjdGl2ZShjb250cm9sLT5lbGVtKSkKKwkJCQkJY29udHJvbC0+ZmxhZ3MgfD0gSVNfQUNUSVZFOworCQkJCWNyZWF0ZV9uYW1lKGNvbnRyb2wpOworCQkJCWlmIChpID09IDApCisJCQkJCWZyb250X2NvbnRyb2wgPSBjb250cm9sOworCQkJCWVsc2UgeworCQkJCQlmcm9udF9jb250cm9sLT5mbGFncyB8PSBJU19NVUxUSUNIIHwgMDsKKwkJCQkJY29udHJvbC0+ZmxhZ3MgfD0gSVNfTVVMVElDSCB8IGk7CisJCQkJfQorCQkJCSsrY29udHJvbDsKKwkJCQkrK2NvdW50OworCQkJfQorCQl9CisJfQorCWlmICh2aWV3X21vZGUgIT0gVklFV19NT0RFX1BMQVlCQUNLICYmIChoYXNfY3ZvbCB8fCBoYXNfY3N3KSAmJiAhbWVyZ2VkX2Nzd2l0Y2gpIHsKKwkJaWYgKCghaGFzX2N2b2wgfHwgc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3ZvbHVtZV9qb2luZWQoZWxlbSkpICYmCisJCSAgICAoIWhhc19jc3cgfHwgc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3N3aXRjaF9qb2luZWQoZWxlbSkpKSB7CisJCQljb250cm9sLT5lbGVtID0gZWxlbTsKKwkJCWlmIChoYXNfY3ZvbCkgeworCQkJCWNvbnRyb2wtPmZsYWdzIHw9IFRZUEVfQ1ZPTFVNRSB8IEhBU19WT0xVTUVfMDsKKwkJCQljb250cm9sLT52b2x1bWVfY2hhbm5lbHNbMF0gPSAwOworCQkJfQorCQkJaWYgKGhhc19jc3cpIHsKKwkJCQljb250cm9sLT5mbGFncyB8PSBUWVBFX0NTV0lUQ0ggfCBIQVNfQ1NXSVRDSF8wOworCQkJCWNvbnRyb2wtPmNzd2l0Y2hfY2hhbm5lbHNbMF0gPSAwOworCQkJfQorCQkJaWYgKHNuZF9taXhlcl9zZWxlbV9pc19hY3RpdmUoY29udHJvbC0+ZWxlbSkpCisJCQkJY29udHJvbC0+ZmxhZ3MgfD0gSVNfQUNUSVZFOworCQkJY3JlYXRlX25hbWUoY29udHJvbCk7CisJCQkrK2NvbnRyb2w7CisJCQkrK2NvdW50OworCQl9IGVsc2UgeworCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3VwcG9ydGVkX2NoYW5uZWxzKTsgKytpKQorCQkJCWhhc19jaGFubmVsW3N1cHBvcnRlZF9jaGFubmVsc1tpXV0gPQorCQkJCQlzbmRfbWl4ZXJfc2VsZW1faGFzX2NhcHR1cmVfY2hhbm5lbChlbGVtLCBzdXBwb3J0ZWRfY2hhbm5lbHNbaV0pOworCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29udHJvbF9jaGFubmVscyk7ICsraSkgeworCQkJCWhhc19jaDAgPSBoYXNfY2hhbm5lbFtjb250cm9sX2NoYW5uZWxzW2ldWzBdXTsKKwkJCQloYXNfY2gxID0gY29udHJvbF9jaGFubmVsc1tpXVsxXSAhPSBTTkRfTUlYRVJfU0NITl9VTktOT1dOICYmCisJCQkJCWhhc19jaGFubmVsW2NvbnRyb2xfY2hhbm5lbHNbaV1bMV1dOworCQkJCWlmICghaGFzX2NoMCAmJiAhaGFzX2NoMSkKKwkJCQkJY29udGludWU7CisJCQkJY29udHJvbC0+ZWxlbSA9IGVsZW07CisJCQkJaWYgKGhhc19jdm9sKSB7CisJCQkJCWNvbnRyb2wtPmZsYWdzIHw9IFRZUEVfQ1ZPTFVNRTsKKwkJCQkJaWYgKHNuZF9taXhlcl9zZWxlbV9oYXNfY2FwdHVyZV92b2x1bWVfam9pbmVkKGVsZW0pKSB7CisJCQkJCQljb250cm9sLT5mbGFncyB8PSBIQVNfVk9MVU1FXzA7CisJCQkJCQljb250cm9sLT52b2x1bWVfY2hhbm5lbHNbMF0gPSAwOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKGhhc19jaDApIHsKKwkJCQkJCQljb250cm9sLT5mbGFncyB8PSBIQVNfVk9MVU1FXzA7CisJCQkJCQkJY29udHJvbC0+dm9sdW1lX2NoYW5uZWxzWzBdID0gY29udHJvbF9jaGFubmVsc1tpXVswXTsKKwkJCQkJCX0KKwkJCQkJCWlmIChoYXNfY2gxKSB7CisJCQkJCQkJY29udHJvbC0+ZmxhZ3MgfD0gSEFTX1ZPTFVNRV8xOworCQkJCQkJCWNvbnRyb2wtPnZvbHVtZV9jaGFubmVsc1sxXSA9IGNvbnRyb2xfY2hhbm5lbHNbaV1bMV07CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKGhhc19jc3cpIHsKKwkJCQkJY29udHJvbC0+ZmxhZ3MgfD0gVFlQRV9DU1dJVENIOworCQkJCQlpZiAoc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3N3aXRjaF9qb2luZWQoZWxlbSkpIHsKKwkJCQkJCWNvbnRyb2wtPmZsYWdzIHw9IEhBU19DU1dJVENIXzA7CisJCQkJCQljb250cm9sLT5jc3dpdGNoX2NoYW5uZWxzWzBdID0gMDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChoYXNfY2gwKSB7CisJCQkJCQkJY29udHJvbC0+ZmxhZ3MgfD0gSEFTX0NTV0lUQ0hfMDsKKwkJCQkJCQljb250cm9sLT5jc3dpdGNoX2NoYW5uZWxzWzBdID0gY29udHJvbF9jaGFubmVsc1tpXVswXTsKKwkJCQkJCX0KKwkJCQkJCWlmIChoYXNfY2gxKSB7CisJCQkJCQkJY29udHJvbC0+ZmxhZ3MgfD0gSEFTX0NTV0lUQ0hfMTsKKwkJCQkJCQljb250cm9sLT5jc3dpdGNoX2NoYW5uZWxzWzFdID0gY29udHJvbF9jaGFubmVsc1tpXVsxXTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoKGNvbnRyb2wtPmZsYWdzICYgKEhBU19WT0xVTUVfMCB8IEhBU19WT0xVTUVfMSkpID09IEhBU19WT0xVTUVfMSkgeworCQkJCQljb250cm9sLT5mbGFncyBePSBIQVNfVk9MVU1FXzAgfCBIQVNfVk9MVU1FXzE7CisJCQkJCWNvbnRyb2wtPnZvbHVtZV9jaGFubmVsc1swXSA9IGNvbnRyb2wtPnZvbHVtZV9jaGFubmVsc1sxXTsKKwkJCQl9CisJCQkJaWYgKChjb250cm9sLT5mbGFncyAmIChIQVNfQ1NXSVRDSF8wIHwgSEFTX0NTV0lUQ0hfMSkpID09IEhBU19DU1dJVENIXzEpIHsKKwkJCQkJY29udHJvbC0+ZmxhZ3MgXj0gSEFTX0NTV0lUQ0hfMCB8IEhBU19DU1dJVENIXzE7CisJCQkJCWNvbnRyb2wtPmNzd2l0Y2hfY2hhbm5lbHNbMF0gPSBjb250cm9sLT5jc3dpdGNoX2NoYW5uZWxzWzFdOworCQkJCX0KKwkJCQlpZiAoc25kX21peGVyX3NlbGVtX2lzX2FjdGl2ZShjb250cm9sLT5lbGVtKSkKKwkJCQkJY29udHJvbC0+ZmxhZ3MgfD0gSVNfQUNUSVZFOworCQkJCWNyZWF0ZV9uYW1lKGNvbnRyb2wpOworCQkJCWlmIChpID09IDApCisJCQkJCWZyb250X2NvbnRyb2wgPSBjb250cm9sOworCQkJCWVsc2UgeworCQkJCQlmcm9udF9jb250cm9sLT5mbGFncyB8PSBJU19NVUxUSUNIIHwgMDsKKwkJCQkJY29udHJvbC0+ZmxhZ3MgfD0gSVNfTVVMVElDSCB8IGk7CisJCQkJfQorCQkJCSsrY29udHJvbDsKKwkJCQkrK2NvdW50OworCQkJfQorCQl9CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHZvaWQgc2VhcmNoX2Zvcl9mb2N1c19jb250cm9sKHZvaWQpCit7CisJc25kX21peGVyX2VsZW1fdCAqZWxlbTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWVsZW0gPSBzbmRfbWl4ZXJfZmluZF9zZWxlbShtaXhlciwgY3VycmVudF9zZWxlbV9pZCk7CisJaWYgKGVsZW0pCisJCWZvciAoaSA9IDA7IGkgPCBjb250cm9sc19jb3VudDsgKytpKQorCQkJaWYgKGNvbnRyb2xzW2ldLmVsZW0gPT0gZWxlbSkgeworCQkJCWZvY3VzX2NvbnRyb2xfaW5kZXggPSBpOworCQkJCWZvciAoOzspIHsKKwkJCQkJKytpOworCQkJCQlpZiAoaSA+PSBjb250cm9sc19jb3VudCB8fCBjb250cm9sc1tpXS5lbGVtICE9IGVsZW0pCisJCQkJCQlyZXR1cm47CisJCQkJCWlmIChjb250cm9sc1tpXS5mbGFncyA9PSBjdXJyZW50X2NvbnRyb2xfZmxhZ3MpIHsKKwkJCQkJCWZvY3VzX2NvbnRyb2xfaW5kZXggPSBpOworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJfQorCQkJfQorCWZvY3VzX2NvbnRyb2xfaW5kZXggPSAwOworfQorCit2b2lkIGZyZWVfY29udHJvbHModm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjb250cm9sc19jb3VudDsgKytpKQorCQlmcmVlKGNvbnRyb2xzW2ldLm5hbWUpOworCWZyZWUoY29udHJvbHMpOworCWNvbnRyb2xzID0gTlVMTDsKKwljb250cm9sc19jb3VudCA9IDA7Cit9CisKK3ZvaWQgY3JlYXRlX2NvbnRyb2xzKHZvaWQpCit7CisJc25kX21peGVyX2VsZW1fdCAqZWxlbTsKKwlzdHJ1Y3QgY29udHJvbCAqY29udHJvbDsKKworCWZyZWVfY29udHJvbHMoKTsKKworCWZvciAoZWxlbSA9IHNuZF9taXhlcl9maXJzdF9lbGVtKG1peGVyKTsKKwkgICAgIGVsZW07CisJICAgICBlbGVtID0gc25kX21peGVyX2VsZW1fbmV4dChlbGVtKSkKKwkJY29udHJvbHNfY291bnQgKz0gZ2V0X2NvbnRyb2xzX2NvdW50X2Zvcl9lbGVtKGVsZW0pOworCisJaWYgKGNvbnRyb2xzX2NvdW50ID4gMCkgeworCQljb250cm9scyA9IGNjYWxsb2MoY29udHJvbHNfY291bnQsIHNpemVvZiAqY29udHJvbHMpOworCQljb250cm9sID0gY29udHJvbHM7CisJCWZvciAoZWxlbSA9IHNuZF9taXhlcl9maXJzdF9lbGVtKG1peGVyKTsKKwkJICAgICBlbGVtOworCQkgICAgIGVsZW0gPSBzbmRfbWl4ZXJfZWxlbV9uZXh0KGVsZW0pKQorCQkJY29udHJvbCArPSBjcmVhdGVfY29udHJvbHNfZm9yX2VsZW0oZWxlbSwgY29udHJvbCk7CisJCWFzc2VydChjb250cm9sID09IGNvbnRyb2xzICsgY29udHJvbHNfY291bnQpOworCX0KKworCWNvbXB1dGVfY29udHJvbHNfbGF5b3V0KCk7CisJZGlzcGxheV92aWV3X21vZGUoKTsKKworCXNlYXJjaF9mb3JfZm9jdXNfY29udHJvbCgpOworCXJlZm9jdXNfY29udHJvbCgpOworfQpkaWZmIC0tZ2l0IGEvYWxzYW1peGVyL21peGVyX2NvbnRyb2xzLmggYi9hbHNhbWl4ZXIvbWl4ZXJfY29udHJvbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmIzYTlkCi0tLSAvZGV2L251bGwKKysrIGIvYWxzYW1peGVyL21peGVyX2NvbnRyb2xzLmgKQEAgLTAsMCArMSwzNyBAQAorI2lmbmRlZiBNSVhFUl9DT05UUk9MU19IX0lOQ0xVREVECisjZGVmaW5lIE1JWEVSX0NPTlRST0xTX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPGFsc2EvYXNvdW5kbGliLmg+CisKK3N0cnVjdCBjb250cm9sIHsKKwlzbmRfbWl4ZXJfZWxlbV90ICplbGVtOworCWNoYXIgKm5hbWU7CisJdW5zaWduZWQgaW50IGZsYWdzOworI2RlZmluZSBUWVBFX1BWT0xVTUUJKDF1IDw8IDQpCisjZGVmaW5lIFRZUEVfQ1ZPTFVNRQkoMXUgPDwgNSkKKyNkZWZpbmUgVFlQRV9QU1dJVENICSgxdSA8PCA2KQorI2RlZmluZSBUWVBFX0NTV0lUQ0gJKDF1IDw8IDcpCisjZGVmaW5lIFRZUEVfRU5VTQkoMXUgPDwgOCkKKyNkZWZpbmUgSEFTX1ZPTFVNRV8wCSgxdSA8PCA5KQorI2RlZmluZSBIQVNfVk9MVU1FXzEJKDF1IDw8IDEwKQorI2RlZmluZSBIQVNfUFNXSVRDSF8wCSgxdSA8PCAxMSkKKyNkZWZpbmUgSEFTX1BTV0lUQ0hfMQkoMXUgPDwgMTIpCisjZGVmaW5lIEhBU19DU1dJVENIXzAJKDF1IDw8IDEzKQorI2RlZmluZSBIQVNfQ1NXSVRDSF8xCSgxdSA8PCAxNCkKKyNkZWZpbmUgSVNfTVVMVElDSAkoMXUgPDwgMTUpCisjZGVmaW5lIElTX0FDVElWRQkoMXUgPDwgMTYpCisjZGVmaW5lIE1VTFRJQ0hfTUFTSwkoMHgwMDAwZikKKwlzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IHZvbHVtZV9jaGFubmVsc1syXTsKKwlzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IHBzd2l0Y2hfY2hhbm5lbHNbMl07CisJc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjc3dpdGNoX2NoYW5uZWxzWzJdOworCXVuc2lnbmVkIGludCBlbnVtX2NoYW5uZWxfYml0czsKK307CisKK2V4dGVybiBzdHJ1Y3QgY29udHJvbCAqY29udHJvbHM7CitleHRlcm4gdW5zaWduZWQgaW50IGNvbnRyb2xzX2NvdW50OworCitib29sIGFyZV90aGVyZV9hbnlfY29udHJvbHModm9pZCk7Cit2b2lkIGNyZWF0ZV9jb250cm9scyh2b2lkKTsKK3ZvaWQgZnJlZV9jb250cm9scyh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jIGIvYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmEzOTZhCi0tLSAvZGV2L251bGwKKysrIGIvYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYwpAQCAtMCwwICsxLDc0MyBAQAorLyoKKyAqIG1peGVyX2Rpc3BsYXkuYyAtIGhhbmRsZXMgZGlzcGxheWluZyBvZiBtaXhlciB3aWRnZXQgYW5kIGNvbnRyb2xzCisgKiBDb3B5cmlnaHQgKGMpIDE4NzQgTGV3aXMgQ2Fycm9sbAorICogQ29weXJpZ2h0IChjKSAyMDA5IENsZW1lbnMgTGFkaXNjaCA8Y2xlbWVuc0BsYWRpc2NoLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2RlZmluZSBfQzk5X1NPVVJDRSAvKiBscmludCgpICovCisjaW5jbHVkZSAiYWNvbmZpZy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSBDVVJTRVNJTkMKKyNpbmNsdWRlIDxhbHNhL2Fzb3VuZGxpYi5oPgorI2luY2x1ZGUgImdldHRleHRfY3Vyc2VzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJtZW0uaCIKKyNpbmNsdWRlICJjb2xvcnMuaCIKKyNpbmNsdWRlICJ3aWRnZXQuaCIKKyNpbmNsdWRlICJ2b2x1bWVfbWFwcGluZy5oIgorI2luY2x1ZGUgIm1peGVyX3dpZGdldC5oIgorI2luY2x1ZGUgIm1peGVyX2NvbnRyb2xzLmgiCisjaW5jbHVkZSAibWl4ZXJfZGlzcGxheS5oIgorCitlbnVtIGFsaWduIHsKKwlBTElHTl9MRUZULAorCUFMSUdOX1JJR0hULAorCUFMSUdOX0NFTlRFUiwKK307CisKK3N0YXRpYyBib29sIHNjcmVlbl90b29fc21hbGw7CitzdGF0aWMgYm9vbCBoYXNfaW5mb19pdGVtczsKKworc3RhdGljIGludCBpbmZvX2l0ZW1zX2xlZnQ7CitzdGF0aWMgaW50IGluZm9faXRlbXNfd2lkdGg7CisKK3N0YXRpYyBpbnQgdmlzaWJsZV9jb250cm9sczsKK3N0YXRpYyBpbnQgZmlyc3RfdmlzaWJsZV9jb250cm9sX2luZGV4Oworc3RhdGljIGludCBmaXJzdF9jb250cm9sX3g7CitzdGF0aWMgaW50IGNvbnRyb2xfd2lkdGg7CitzdGF0aWMgaW50IGNvbnRyb2xfbmFtZV93aWR0aDsKKworc3RhdGljIGludCBiYXNlX3k7CitzdGF0aWMgaW50IHZvbHVtZV9oZWlnaHQ7CitzdGF0aWMgaW50IGNzd2l0Y2hfeTsKK3N0YXRpYyBpbnQgdmFsdWVzX3k7CitzdGF0aWMgaW50IG5hbWVfeTsKK3N0YXRpYyBpbnQgY2hhbm5lbF9uYW1lX3k7CisKK3N0YXRpYyB2b2lkIGRpc3BsYXlfc3RyaW5nX2luX2ZpZWxkKGludCB5LCBpbnQgeCwgY29uc3QgY2hhciAqcywgaW50IHdpZHRoLCBlbnVtIGFsaWduIGFsaWduKQoreworCWludCBzdHJpbmdfd2lkdGg7CisJY29uc3QgY2hhciAqc19lbmQ7CisJaW50IHNwYWNlczsKKwlpbnQgY3VyX3ksIGN1cl94OworCisJd21vdmUobWl4ZXJfd2lkZ2V0LndpbmRvdywgeSwgeCk7CisJc3RyaW5nX3dpZHRoID0gd2lkdGg7CisJc19lbmQgPSBtYnNfYXRfd2lkdGgocywgJnN0cmluZ193aWR0aCwgLTEpOworCWlmIChzdHJpbmdfd2lkdGggPj0gd2lkdGgpIHsKKwkJd2FkZG5zdHIobWl4ZXJfd2lkZ2V0LndpbmRvdywgcywgc19lbmQgLSBzKTsKKwl9IGVsc2UgeworCQlpZiAoYWxpZ24gIT0gQUxJR05fTEVGVCkgeworCQkJc3BhY2VzID0gd2lkdGggLSBzdHJpbmdfd2lkdGg7CisJCQlpZiAoYWxpZ24gPT0gQUxJR05fQ0VOVEVSKQorCQkJCXNwYWNlcyAvPSAyOworCQkJaWYgKHNwYWNlcyA+IDApCisJCQkJd3ByaW50dyhtaXhlcl93aWRnZXQud2luZG93LCAiJSpzIiwgc3BhY2VzLCAiIik7CisJCX0KKwkJd2FkZHN0cihtaXhlcl93aWRnZXQud2luZG93LCBzKTsKKwkJaWYgKGFsaWduICE9IEFMSUdOX1JJR0hUKSB7CisJCQlnZXR5eChtaXhlcl93aWRnZXQud2luZG93LCBjdXJfeSwgY3VyX3gpOworCQkJaWYgKGN1cl95ID09IHkpIHsKKwkJCQlzcGFjZXMgPSB4ICsgd2lkdGggLSBjdXJfeDsKKwkJCQlpZiAoc3BhY2VzID4gMCkKKwkJCQkJd3ByaW50dyhtaXhlcl93aWRnZXQud2luZG93LCAiJSpzIiwgc3BhY2VzLCAiIik7CisJCQl9CisJCX0KKwl9Cit9CisKK3ZvaWQgaW5pdF9taXhlcl9sYXlvdXQodm9pZCkKK3sKKwljb25zdCBjaGFyICpsYWJlbHNfbGVmdFs0XSA9IHsKKwkJXygiQ2FyZDoiKSwKKwkJXygiQ2hpcDoiKSwKKwkJXygiVmlldzoiKSwKKwkJXygiSXRlbToiKSwKKwl9OworCWNvbnN0IGNoYXIgKmxhYmVsc19yaWdodFs0XSA9IHsKKwkJXygiRjE6ICBIZWxwIiksCisJCV8oIkYyOiAgU3lzdGVtIGluZm9ybWF0aW9uIiksCisJCV8oIkY2OiAgU2VsZWN0IHNvdW5kIGNhcmQiKSwKKwkJXygiRXNjOiBFeGl0IiksCisJfTsKKwl1bnNpZ25lZCBpbnQgbGFiZWxfd2lkdGhfbGVmdCwgbGFiZWxfd2lkdGhfcmlnaHQ7CisJdW5zaWduZWQgaW50IHJpZ2h0X3gsIGk7CisKKwlzY3JlZW5fdG9vX3NtYWxsID0gc2NyZWVuX2xpbmVzIDwgMTQgfHwgc2NyZWVuX2NvbHMgPCAxMjsKKwloYXNfaW5mb19pdGVtcyA9IHNjcmVlbl9saW5lcyA+PSA2OworCWlmICghaGFzX2luZm9faXRlbXMpCisJCXJldHVybjsKKworCWxhYmVsX3dpZHRoX2xlZnQgPSBnZXRfbWF4X21ic193aWR0aChsYWJlbHNfbGVmdCwgNCk7CisJbGFiZWxfd2lkdGhfcmlnaHQgPSBnZXRfbWF4X21ic193aWR0aChsYWJlbHNfcmlnaHQsIDQpOworCWlmICgyICsgbGFiZWxfd2lkdGhfbGVmdCArIDEgKyAyOCArIGxhYmVsX3dpZHRoX3JpZ2h0ICsgMiA+IHNjcmVlbl9jb2xzKQorCQlsYWJlbF93aWR0aF9yaWdodCA9IDA7CisJaWYgKDIgKyBsYWJlbF93aWR0aF9sZWZ0ICsgMSArIDI4ICsgbGFiZWxfd2lkdGhfcmlnaHQgKyAyID4gc2NyZWVuX2NvbHMpCisJCWxhYmVsX3dpZHRoX2xlZnQgPSAwOworCisJaW5mb19pdGVtc19sZWZ0ID0gbGFiZWxfd2lkdGhfbGVmdCA/IDMgKyBsYWJlbF93aWR0aF9sZWZ0IDogMjsKKwlyaWdodF94ID0gc2NyZWVuX2NvbHMgLSBsYWJlbF93aWR0aF9yaWdodCAtIDI7CisJaW5mb19pdGVtc193aWR0aCA9IHJpZ2h0X3ggLSBpbmZvX2l0ZW1zX2xlZnQ7CisJaWYgKGluZm9faXRlbXNfd2lkdGggPCAxKSB7CisJCWhhc19pbmZvX2l0ZW1zID0gRkFMU0U7CisJCXJldHVybjsKKwl9CisKKwl3YXR0cnNldChtaXhlcl93aWRnZXQud2luZG93LCBhdHRyX21peGVyX3RleHQpOworCWlmIChsYWJlbF93aWR0aF9sZWZ0KQorCQlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKQorCQkJZGlzcGxheV9zdHJpbmdfaW5fZmllbGQoMSArIGksIDIsIGxhYmVsc19sZWZ0W2ldLAorCQkJCQkJbGFiZWxfd2lkdGhfbGVmdCwgQUxJR05fUklHSFQpOworCWlmIChsYWJlbF93aWR0aF9yaWdodCkKKwkJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkKKwkJCWRpc3BsYXlfc3RyaW5nX2luX2ZpZWxkKDEgKyBpLCByaWdodF94LCBsYWJlbHNfcmlnaHRbaV0sCisJCQkJCQlsYWJlbF93aWR0aF9yaWdodCwgQUxJR05fTEVGVCk7Cit9CisKK3ZvaWQgZGlzcGxheV9jYXJkX2luZm8odm9pZCkKK3sKKwlzbmRfaGN0bF90ICpoY3RsOworCXNuZF9jdGxfdCAqY3RsOworCXNuZF9jdGxfY2FyZF9pbmZvX3QgKmNhcmRfaW5mbzsKKwljb25zdCBjaGFyICpjYXJkX25hbWUgPSBOVUxMOworCWNvbnN0IGNoYXIgKm1peGVyX25hbWUgPSBOVUxMOworCWludCBlcnI7CisKKwlpZiAoIWhhc19pbmZvX2l0ZW1zKQorCQlyZXR1cm47CisKKwlzbmRfY3RsX2NhcmRfaW5mb19hbGxvY2EoJmNhcmRfaW5mbyk7CisJaWYgKG1peGVyX2RldmljZV9uYW1lKQorCQllcnIgPSBzbmRfbWl4ZXJfZ2V0X2hjdGwobWl4ZXIsIG1peGVyX2RldmljZV9uYW1lLCAmaGN0bCk7CisJZWxzZQorCQllcnIgPSAtMTsKKwlpZiAoZXJyID49IDApIHsKKwkJY3RsID0gc25kX2hjdGxfY3RsKGhjdGwpOworCQllcnIgPSBzbmRfY3RsX2NhcmRfaW5mbyhjdGwsIGNhcmRfaW5mbyk7CisJCWlmIChlcnIgPj0gMCkgeworCQkJY2FyZF9uYW1lID0gc25kX2N0bF9jYXJkX2luZm9fZ2V0X25hbWUoY2FyZF9pbmZvKTsKKwkJCW1peGVyX25hbWUgPSBzbmRfY3RsX2NhcmRfaW5mb19nZXRfbWl4ZXJuYW1lKGNhcmRfaW5mbyk7CisJCX0KKwl9CisKKwlpZiAoY2FyZF9uYW1lKQorCQl3YXR0cnNldChtaXhlcl93aWRnZXQud2luZG93LCBhdHRyX21peGVyX2FjdGl2ZSk7CisJZWxzZSB7CisJCXdhdHRyc2V0KG1peGVyX3dpZGdldC53aW5kb3csIGF0dHJfbWl4ZXJfdGV4dCk7CisJCWlmICh1bnBsdWdnZWQpCisJCQljYXJkX25hbWUgPSBfKCIodW5wbHVnZ2VkKSIpOworCQllbHNlCisJCQljYXJkX25hbWUgPSAiLSI7CisJfQorCWRpc3BsYXlfc3RyaW5nX2luX2ZpZWxkKDEsIGluZm9faXRlbXNfbGVmdCwgY2FyZF9uYW1lLCBpbmZvX2l0ZW1zX3dpZHRoLCBBTElHTl9MRUZUKTsKKworCWlmIChtaXhlcl9uYW1lKQorCQl3YXR0cnNldChtaXhlcl93aWRnZXQud2luZG93LCBhdHRyX21peGVyX2FjdGl2ZSk7CisJZWxzZSB7CisJCXdhdHRyc2V0KG1peGVyX3dpZGdldC53aW5kb3csIGF0dHJfbWl4ZXJfdGV4dCk7CisJCW1peGVyX25hbWUgPSAiLSI7CisJfQorCWRpc3BsYXlfc3RyaW5nX2luX2ZpZWxkKDIsIGluZm9faXRlbXNfbGVmdCwgbWl4ZXJfbmFtZSwgaW5mb19pdGVtc193aWR0aCwgQUxJR05fTEVGVCk7Cit9CisKK3ZvaWQgZGlzcGxheV92aWV3X21vZGUodm9pZCkKK3sKKwljb25zdCBjaGFyICptb2Rlc1szXSA9IHsKKwkJXygiUGxheWJhY2siKSwKKwkJXygiQ2FwdHVyZSIpLAorCQlfKCJBbGwiKSwKKwl9OworCXVuc2lnbmVkIGludCB3aWR0aHNbM107CisJYm9vbCBoYXNfdmlld19tb2RlOworCWludCBpOworCisJaWYgKCFoYXNfaW5mb19pdGVtcykKKwkJcmV0dXJuOworCisJaGFzX3ZpZXdfbW9kZSA9IGNvbnRyb2xzX2NvdW50ID4gMCB8fCBhcmVfdGhlcmVfYW55X2NvbnRyb2xzKCk7CisJZm9yIChpID0gMDsgaSA8IDM7ICsraSkKKwkJd2lkdGhzW2ldID0gZ2V0X21ic193aWR0aChtb2Rlc1tpXSk7CisJaWYgKDQgKyB3aWR0aHNbMF0gKyA2ICsgd2lkdGhzWzFdICsgNiArIHdpZHRoc1syXSArIDEgPD0gaW5mb19pdGVtc193aWR0aCkgeworCQl3bW92ZShtaXhlcl93aWRnZXQud2luZG93LCAzLCBpbmZvX2l0ZW1zX2xlZnQpOworCQl3YXR0cnNldChtaXhlcl93aWRnZXQud2luZG93LCBhdHRyX21peGVyX3RleHQpOworCQlmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7CisJCQl3cHJpbnR3KG1peGVyX3dpZGdldC53aW5kb3csICJGJWM6IiwgJzMnICsgaSk7CisJCQlpZiAoaGFzX3ZpZXdfbW9kZSAmJiAoaW50KXZpZXdfbW9kZSA9PSBpKSB7CisJCQkJd2F0dHJzZXQobWl4ZXJfd2lkZ2V0LndpbmRvdywgYXR0cl9taXhlcl9hY3RpdmUpOworCQkJCXdwcmludHcobWl4ZXJfd2lkZ2V0LndpbmRvdywgIlslc10iLCBtb2Rlc1tpXSk7CisJCQkJd2F0dHJzZXQobWl4ZXJfd2lkZ2V0LndpbmRvdywgYXR0cl9taXhlcl90ZXh0KTsKKwkJCX0gZWxzZSB7CisJCQkJd3ByaW50dyhtaXhlcl93aWRnZXQud2luZG93LCAiICVzICIsIG1vZGVzW2ldKTsKKwkJCX0KKwkJCWlmIChpIDwgMikKKwkJCQl3YWRkY2gobWl4ZXJfd2lkZ2V0LndpbmRvdywgJyAnKTsKKwkJfQorCX0gZWxzZSB7CisJCXdhdHRyc2V0KG1peGVyX3dpZGdldC53aW5kb3csIGF0dHJfbWl4ZXJfYWN0aXZlKTsKKwkJZGlzcGxheV9zdHJpbmdfaW5fZmllbGQoMywgaW5mb19pdGVtc19sZWZ0LAorCQkJCQloYXNfdmlld19tb2RlID8gbW9kZXNbdmlld19tb2RlXSA6ICIiLAorCQkJCQlpbmZvX2l0ZW1zX3dpZHRoLCBBTElHTl9MRUZUKTsKKwl9Cit9CisKK3N0YXRpYyBjaGFyICpmb3JtYXRfZ2Fpbihsb25nIGRiKQoreworCWlmIChkYiAhPSBTTkRfQ1RMX1RMVl9EQl9HQUlOX01VVEUpCisJCXJldHVybiBjYXNwcmludGYoIiUuMmYiLCBkYiAvIDEwMC4wKTsKKwllbHNlCisJCXJldHVybiBjc3RyZHVwKF8oIm11dGUiKSk7Cit9CisKK3N0YXRpYyB2b2lkIGRpc3BsYXlfZm9jdXNfaXRlbV9pbmZvKHZvaWQpCit7CisJc3RydWN0IGNvbnRyb2wgKmNvbnRyb2w7CisJdW5zaWduZWQgaW50IGluZGV4OworCWNoYXIgYnVmWzY0XTsKKwlsb25nIGRiLCBkYjI7CisJaW50IHN3LCBzdzI7CisJY2hhciAqZGJzLCAqZGJzMjsKKwljaGFyICp2YWx1ZV9pbmZvOworCWNoYXIgKml0ZW1faW5mbzsKKwlpbnQgZXJyOworCisJaWYgKCFoYXNfaW5mb19pdGVtcykKKwkJcmV0dXJuOworCXdhdHRyc2V0KG1peGVyX3dpZGdldC53aW5kb3csIGF0dHJfbWl4ZXJfYWN0aXZlKTsKKwlpZiAoIWNvbnRyb2xzX2NvdW50IHx8IHNjcmVlbl90b29fc21hbGwpIHsKKwkJZGlzcGxheV9zdHJpbmdfaW5fZmllbGQoNCwgaW5mb19pdGVtc19sZWZ0LCAiIiwgaW5mb19pdGVtc193aWR0aCwgQUxJR05fTEVGVCk7CisJCXJldHVybjsKKwl9CisJY29udHJvbCA9ICZjb250cm9sc1tmb2N1c19jb250cm9sX2luZGV4XTsKKwl2YWx1ZV9pbmZvID0gTlVMTDsKKwlpZiAoY29udHJvbC0+ZmxhZ3MgJiBUWVBFX0VOVU0pIHsKKwkJZXJyID0gc25kX21peGVyX3NlbGVtX2dldF9lbnVtX2l0ZW0oY29udHJvbC0+ZWxlbSwgZmZzKGNvbnRyb2wtPmVudW1fY2hhbm5lbF9iaXRzKSAtIDEsICZpbmRleCk7CisJCWlmIChlcnIgPj0gMCkKKwkJCWVyciA9IHNuZF9taXhlcl9zZWxlbV9nZXRfZW51bV9pdGVtX25hbWUoY29udHJvbC0+ZWxlbSwgaW5kZXgsIHNpemVvZiBidWYgLSAxLCBidWYpOworCQlpZiAoZXJyID49IDApCisJCQl2YWx1ZV9pbmZvID0gY2FzcHJpbnRmKCIgWyVzXSIsIGJ1Zik7CisJfSBlbHNlIGlmIChjb250cm9sLT5mbGFncyAmIChUWVBFX1BWT0xVTUUgfCBUWVBFX0NWT0xVTUUpKSB7CisJCWludCAoKmdldF92b2xfZnVuYykoc25kX21peGVyX2VsZW1fdCAqLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90LCBsb25nICopOworCisJCWlmIChjb250cm9sLT5mbGFncyAmIFRZUEVfUFZPTFVNRSkKKwkJCWdldF92b2xfZnVuYyA9IHNuZF9taXhlcl9zZWxlbV9nZXRfcGxheWJhY2tfZEI7CisJCWVsc2UKKwkJCWdldF92b2xfZnVuYyA9IHNuZF9taXhlcl9zZWxlbV9nZXRfY2FwdHVyZV9kQjsKKwkJaWYgKCEoY29udHJvbC0+ZmxhZ3MgJiBIQVNfVk9MVU1FXzEpKSB7CisJCQllcnIgPSBnZXRfdm9sX2Z1bmMoY29udHJvbC0+ZWxlbSwgY29udHJvbC0+dm9sdW1lX2NoYW5uZWxzWzBdLCAmZGIpOworCQkJaWYgKGVyciA+PSAwKSB7CisJCQkJZGJzID0gZm9ybWF0X2dhaW4oZGIpOworCQkJCXZhbHVlX2luZm8gPSBjYXNwcmludGYoIiBbJXMgJXNdIiwgXygiZEIgZ2FpbjoiKSwgZGJzKTsKKwkJCQlmcmVlKGRicyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQllcnIgPSBnZXRfdm9sX2Z1bmMoY29udHJvbC0+ZWxlbSwgY29udHJvbC0+dm9sdW1lX2NoYW5uZWxzWzBdLCAmZGIpOworCQkJaWYgKGVyciA+PSAwKQorCQkJCWVyciA9IGdldF92b2xfZnVuYyhjb250cm9sLT5lbGVtLCBjb250cm9sLT52b2x1bWVfY2hhbm5lbHNbMV0sICZkYjIpOworCQkJaWYgKGVyciA+PSAwKSB7CisJCQkJZGJzID0gZm9ybWF0X2dhaW4oZGIpOworCQkJCWRiczIgPSBmb3JtYXRfZ2FpbihkYjIpOworCQkJCXZhbHVlX2luZm8gPSBjYXNwcmludGYoXygiIFslcyAlcywgJXNdIiksIF8oImRCIGdhaW46IiksIGRicywgZGJzMik7CisJCQkJZnJlZShkYnMpOworCQkJCWZyZWUoZGJzMik7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGNvbnRyb2wtPmZsYWdzICYgVFlQRV9QU1dJVENIKSB7CisJCWlmICghKGNvbnRyb2wtPmZsYWdzICYgSEFTX1BTV0lUQ0hfMSkpIHsKKwkJCWVyciA9IHNuZF9taXhlcl9zZWxlbV9nZXRfcGxheWJhY2tfc3dpdGNoKGNvbnRyb2wtPmVsZW0sIGNvbnRyb2wtPnBzd2l0Y2hfY2hhbm5lbHNbMF0sICZzdyk7CisJCQlpZiAoZXJyID49IDAgJiYgIXN3KQorCQkJCXZhbHVlX2luZm8gPSBjYXNwcmludGYoIiBbJXNdIiwgXygiT2ZmIikpOworCQl9IGVsc2UgeworCQkJZXJyID0gc25kX21peGVyX3NlbGVtX2dldF9wbGF5YmFja19zd2l0Y2goY29udHJvbC0+ZWxlbSwgY29udHJvbC0+cHN3aXRjaF9jaGFubmVsc1swXSwgJnN3KTsKKwkJCWlmIChlcnIgPj0gMCkKKwkJCQllcnIgPSBzbmRfbWl4ZXJfc2VsZW1fZ2V0X3BsYXliYWNrX3N3aXRjaChjb250cm9sLT5lbGVtLCBjb250cm9sLT5wc3dpdGNoX2NoYW5uZWxzWzFdLCAmc3cyKTsKKwkJCWlmIChlcnIgPj0gMCAmJiAoIXN3IHx8ICFzdzIpKQorCQkJCXZhbHVlX2luZm8gPSBjYXNwcmludGYoIiBbJXMsICVzXSIsIHN3ID8gXygiT24iKSA6IF8oIk9mZiIpLCBzdzIgPyBfKCJPbiIpIDogXygiT2ZmIikpOworCQl9CisJfSBlbHNlIGlmIChjb250cm9sLT5mbGFncyAmIFRZUEVfQ1NXSVRDSCkgeworCQlpZiAoIShjb250cm9sLT5mbGFncyAmIEhBU19DU1dJVENIXzEpKSB7CisJCQllcnIgPSBzbmRfbWl4ZXJfc2VsZW1fZ2V0X2NhcHR1cmVfc3dpdGNoKGNvbnRyb2wtPmVsZW0sIGNvbnRyb2wtPmNzd2l0Y2hfY2hhbm5lbHNbMF0sICZzdyk7CisJCQlpZiAoZXJyID49IDAgJiYgIXN3KQorCQkJCXZhbHVlX2luZm8gPSBjYXNwcmludGYoIiBbJXNdIiwgXygiT2ZmIikpOworCQl9IGVsc2UgeworCQkJZXJyID0gc25kX21peGVyX3NlbGVtX2dldF9jYXB0dXJlX3N3aXRjaChjb250cm9sLT5lbGVtLCBjb250cm9sLT5jc3dpdGNoX2NoYW5uZWxzWzBdLCAmc3cpOworCQkJaWYgKGVyciA+PSAwKQorCQkJCWVyciA9IHNuZF9taXhlcl9zZWxlbV9nZXRfY2FwdHVyZV9zd2l0Y2goY29udHJvbC0+ZWxlbSwgY29udHJvbC0+Y3N3aXRjaF9jaGFubmVsc1sxXSwgJnN3Mik7CisJCQlpZiAoZXJyID49IDAgJiYgKCFzdyB8fCAhc3cyKSkKKwkJCQl2YWx1ZV9pbmZvID0gY2FzcHJpbnRmKCIgWyVzLCAlc10iLCBzdyA/IF8oIk9uIikgOiBfKCJPZmYiKSwgc3cyID8gXygiT24iKSA6IF8oIk9mZiIpKTsKKwkJfQorCX0KKwlpdGVtX2luZm8gPSBjYXNwcmludGYoIiVzJXMiLCBjb250cm9sLT5uYW1lLCB2YWx1ZV9pbmZvID8gdmFsdWVfaW5mbyA6ICIiKTsKKwlmcmVlKHZhbHVlX2luZm8pOworCWRpc3BsYXlfc3RyaW5nX2luX2ZpZWxkKDQsIGluZm9faXRlbXNfbGVmdCwgaXRlbV9pbmZvLCBpbmZvX2l0ZW1zX3dpZHRoLCBBTElHTl9MRUZUKTsKKwlmcmVlKGl0ZW1faW5mbyk7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX2NvbnRyb2xzX2Rpc3BsYXkodm9pZCkKK3sKKwlpbnQgaTsKKworCXdhdHRyc2V0KG1peGVyX3dpZGdldC53aW5kb3csIGF0dHJfbWl4ZXJfZnJhbWUpOworCWZvciAoaSA9IDU7IGkgPCBzY3JlZW5fbGluZXMgLSAxOyArK2kpCisJCW12d3ByaW50dyhtaXhlcl93aWRnZXQud2luZG93LCBpLCAxLCAiJSpzIiwgc2NyZWVuX2NvbHMgLSAyLCAiIik7Cit9CisKK3N0YXRpYyB2b2lkIGNlbnRlcl9zdHJpbmcoaW50IGxpbmUsIGNvbnN0IGNoYXIgKnMpCit7CisJaW50IHdpZHRoID0gZ2V0X21ic193aWR0aChzKTsKKwlpZiAod2lkdGggPD0gc2NyZWVuX2NvbHMgLSAyKQorCQltdndhZGRzdHIobWl4ZXJfd2lkZ2V0LndpbmRvdywgbGluZSwgKHNjcmVlbl9jb2xzIC0gd2lkdGgpIC8gMiwgcyk7Cit9CisKK3N0YXRpYyB2b2lkIGRpc3BsYXlfdW5wbHVnZ2VkKHZvaWQpCit7CisJaW50IGxpbmVzLCB0b3AsIGxlZnQ7CisJYm9vbCBib29qdW07CisKKwlsaW5lcyA9IHNjcmVlbl9saW5lcyAtIDY7CisJaWYgKGxpbmVzIDwgMikKKwkJcmV0dXJuOworCXRvcCA9IGxpbmVzIC8gMjsKKwlib29qdW0gPSBsaW5lcyA+PSAxMCAmJiBzY3JlZW5fY29scyA+PSA0ODsKKwl0b3AgLT0gYm9vanVtID8gNSA6IDE7CisJaWYgKHRvcCA8IDUpCisJCXRvcCA9IDU7CisJaWYgKGJvb2p1bSkgeworCQlsZWZ0ID0gKHNjcmVlbl9jb2xzIC0gNDYpIC8gMjsKKwkJd2F0dHJzZXQobWl4ZXJfd2lkZ2V0LndpbmRvdywgYXR0cl9taXhlcl90ZXh0KTsKKwkJbXZ3YWRkc3RyKG1peGVyX3dpZGdldC53aW5kb3csIHRvcCArIDAsIGxlZnQsICAgICJJbiB0aGUgbWlkc3Qgb2YgdGhlIHdvcmQgaGUgd2FzIHRyeWluZyB0byBzYXksIik7CisJCW12d2FkZHN0cihtaXhlcl93aWRnZXQud2luZG93LCB0b3AgKyAxLCBsZWZ0ICsgMiwgICJJbiB0aGUgbWlkc3Qgb2YgaGlzIGxhdWdodGVyIGFuZCBnbGVlLCIpOworCQltdndhZGRzdHIobWl4ZXJfd2lkZ2V0LndpbmRvdywgdG9wICsgMiwgbGVmdCwgICAgIkhlIGhhZCBzb2Z0bHkgYW5kIHN1ZGRlbmx5IHZhbmlzaGVkIGF3YXktLS0iKTsKKwkJbXZ3YWRkc3RyKG1peGVyX3dpZGdldC53aW5kb3csIHRvcCArIDMsIGxlZnQgKyAyLCAgIkZvciB0aGUgU25hcmsgd2FzIGEgQm9vanVtLCB5b3Ugc2VlLiIpOworCQltdndjaGdhdChtaXhlcl93aWRnZXQud2luZG93LCAgdG9wICsgMywgbGVmdCArIDE2LCAzLCAgICAgICAgICAvKiBeXl4gKi8KKwkJCSBhdHRyX21peGVyX3RleHQgfCBBX0JPTEQsIFBBSVJfTlVNQkVSKGF0dHJfbWl4ZXJfdGV4dCksIE5VTEwpOworCQltdndhZGRzdHIobWl4ZXJfd2lkZ2V0LndpbmRvdywgdG9wICsgNSwgbGVmdCwgICAgIihMZXdpcyBDYXJyb2xsLCBcIlRoZSBIdW50aW5nIG9mIHRoZSBTbmFya1wiKSIpOworCQl0b3AgKz0gODsKKwl9CisJd2F0dHJzZXQobWl4ZXJfd2lkZ2V0LndpbmRvdywgYXR0cl9lcnJvcm1zZyk7CisJY2VudGVyX3N0cmluZyh0b3AsIF8oIlRoZSBzb3VuZCBkZXZpY2Ugd2FzIHVucGx1Z2dlZC4iKSk7CisJY2VudGVyX3N0cmluZyh0b3AgKyAxLCBfKCJQcmVzcyBGNiB0byBzZWxlY3QgYW5vdGhlciBzb3VuZCBjYXJkLiIpKTsKK30KKworc3RhdGljIHZvaWQgZGlzcGxheV9ub19jb250cm9scyh2b2lkKQoreworCWludCB5OworCWNvbnN0IGNoYXIgKm1zZzsKKworCXkgPSAoc2NyZWVuX2xpbmVzIC0gNikgLyAyIC0gMTsKKwlpZiAoeSA8IDUpCisJCXkgPSA1OworCWlmICh5ID49IHNjcmVlbl9saW5lcyAtIDEpCisJCXJldHVybjsKKwl3YXR0cnNldChtaXhlcl93aWRnZXQud2luZG93LCBhdHRyX2luZm9tc2cpOworCWlmICh2aWV3X21vZGUgPT0gVklFV19NT0RFX1BMQVlCQUNLICYmIGFyZV90aGVyZV9hbnlfY29udHJvbHMoKSkKKwkJbXNnID0gXygiVGhpcyBzb3VuZCBkZXZpY2UgZG9lcyBub3QgaGF2ZSBhbnkgcGxheWJhY2sgY29udHJvbHMuIik7CisJZWxzZSBpZiAodmlld19tb2RlID09IFZJRVdfTU9ERV9DQVBUVVJFICYmIGFyZV90aGVyZV9hbnlfY29udHJvbHMoKSkKKwkJbXNnID0gXygiVGhpcyBzb3VuZCBkZXZpY2UgZG9lcyBub3QgaGF2ZSBhbnkgY2FwdHVyZSBjb250cm9scy4iKTsKKwllbHNlCisJCW1zZyA9IF8oIlRoaXMgc291bmQgZGV2aWNlIGRvZXMgbm90IGhhdmUgYW55IGNvbnRyb2xzLiIpOworCWNlbnRlcl9zdHJpbmcoeSwgbXNnKTsKK30KKworc3RhdGljIHZvaWQgZGlzcGxheV9zdHJpbmdfY2VudGVyZWRfaW5fY29udHJvbChpbnQgeSwgaW50IGNvbCwgY29uc3QgY2hhciAqcywgaW50IHdpZHRoKQoreworCWludCBsZWZ0LCB4OworCisJbGVmdCA9IGZpcnN0X2NvbnRyb2xfeCArIGNvbCAqIChjb250cm9sX3dpZHRoICsgMSk7CisJeCA9IGxlZnQgKyAoY29udHJvbF93aWR0aCAtIHdpZHRoKSAvIDI7CisJZGlzcGxheV9zdHJpbmdfaW5fZmllbGQoeSwgeCwgcywgd2lkdGgsIEFMSUdOX0NFTlRFUik7Cit9CisKK3N0YXRpYyB2b2lkIGRpc3BsYXlfY29udHJvbCh1bnNpZ25lZCBpbnQgY29udHJvbF9pbmRleCkKK3sKKwlzdHJ1Y3QgY29udHJvbCAqY29udHJvbDsKKwlpbnQgY29sOworCWludCBpLCBjOworCWludCBsZWZ0LCBmcmFtZV9sZWZ0OworCWludCBiYXJfaGVpZ2h0OworCWRvdWJsZSB2b2x1bWVzWzJdOworCWludCBzd2l0Y2hlc1syXTsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJY29uc3QgY2hhciAqczsKKwljaGFyIGJ1Zls2NF07CisJaW50IGVycjsKKworCWNvbnRyb2wgPSAmY29udHJvbHNbY29udHJvbF9pbmRleF07CisJY29sID0gY29udHJvbF9pbmRleCAtIGZpcnN0X3Zpc2libGVfY29udHJvbF9pbmRleDsKKwlsZWZ0ID0gZmlyc3RfY29udHJvbF94ICsgY29sICogKGNvbnRyb2xfd2lkdGggKyAxKTsKKwlmcmFtZV9sZWZ0ID0gbGVmdCArIChjb250cm9sX3dpZHRoIC0gNCkgLyAyOworCWlmIChjb250cm9sLT5mbGFncyAmIElTX0FDVElWRSkKKwkJd2F0dHJzZXQobWl4ZXJfd2lkZ2V0LndpbmRvdywgYXR0cl9jdGxfZnJhbWUpOworCWVsc2UKKwkJd2F0dHJzZXQobWl4ZXJfd2lkZ2V0LndpbmRvdywgYXR0cl9jdGxfaW5hY3RpdmUpOworCWlmIChjb250cm9sLT5mbGFncyAmIChUWVBFX1BWT0xVTUUgfCBUWVBFX0NWT0xVTUUpKSB7CisJCW12d2FkZGNoKG1peGVyX3dpZGdldC53aW5kb3csIGJhc2VfeSAtIHZvbHVtZV9oZWlnaHQgLSAxLCBmcmFtZV9sZWZ0LCBBQ1NfVUxDT1JORVIpOworCQl3YWRkY2gobWl4ZXJfd2lkZ2V0LndpbmRvdywgQUNTX0hMSU5FKTsKKwkJd2FkZGNoKG1peGVyX3dpZGdldC53aW5kb3csIEFDU19ITElORSk7CisJCXdhZGRjaChtaXhlcl93aWRnZXQud2luZG93LCBBQ1NfVVJDT1JORVIpOworCQlmb3IgKGkgPSAwOyBpIDwgdm9sdW1lX2hlaWdodDsgKytpKSB7CisJCQltdndhZGRjaChtaXhlcl93aWRnZXQud2luZG93LCBiYXNlX3kgLSBpIC0gMSwgZnJhbWVfbGVmdCwgQUNTX1ZMSU5FKTsKKwkJCW12d2FkZGNoKG1peGVyX3dpZGdldC53aW5kb3csIGJhc2VfeSAtIGkgLSAxLCBmcmFtZV9sZWZ0ICsgMywgQUNTX1ZMSU5FKTsKKwkJfQorCQltdndhZGRjaChtaXhlcl93aWRnZXQud2luZG93LCBiYXNlX3ksIGZyYW1lX2xlZnQsCisJCQkgY29udHJvbC0+ZmxhZ3MgJiBUWVBFX1BTV0lUQ0ggPyBBQ1NfTFRFRSA6IEFDU19MTENPUk5FUik7CisJCXdhZGRjaChtaXhlcl93aWRnZXQud2luZG93LCBBQ1NfSExJTkUpOworCQl3YWRkY2gobWl4ZXJfd2lkZ2V0LndpbmRvdywgQUNTX0hMSU5FKTsKKwkJd2FkZGNoKG1peGVyX3dpZGdldC53aW5kb3csCisJCSAgICAgICBjb250cm9sLT5mbGFncyAmIFRZUEVfUFNXSVRDSCA/IEFDU19SVEVFIDogQUNTX0xSQ09STkVSKTsKKwl9IGVsc2UgaWYgKGNvbnRyb2wtPmZsYWdzICYgVFlQRV9QU1dJVENIKSB7CisJCW12d2FkZGNoKG1peGVyX3dpZGdldC53aW5kb3csIGJhc2VfeSwgZnJhbWVfbGVmdCwgQUNTX1VMQ09STkVSKTsKKwkJd2FkZGNoKG1peGVyX3dpZGdldC53aW5kb3csIEFDU19ITElORSk7CisJCXdhZGRjaChtaXhlcl93aWRnZXQud2luZG93LCBBQ1NfSExJTkUpOworCQl3YWRkY2gobWl4ZXJfd2lkZ2V0LndpbmRvdywgQUNTX1VSQ09STkVSKTsKKwl9CisJaWYgKGNvbnRyb2wtPmZsYWdzICYgVFlQRV9QU1dJVENIKSB7CisJCW12d2FkZGNoKG1peGVyX3dpZGdldC53aW5kb3csIGJhc2VfeSArIDEsIGZyYW1lX2xlZnQsIEFDU19WTElORSk7CisJCW12d2FkZGNoKG1peGVyX3dpZGdldC53aW5kb3csIGJhc2VfeSArIDEsIGZyYW1lX2xlZnQgKyAzLCBBQ1NfVkxJTkUpOworCQltdndhZGRjaChtaXhlcl93aWRnZXQud2luZG93LCBiYXNlX3kgKyAyLCBmcmFtZV9sZWZ0LCBBQ1NfTExDT1JORVIpOworCQl3YWRkY2gobWl4ZXJfd2lkZ2V0LndpbmRvdywgQUNTX0hMSU5FKTsKKwkJd2FkZGNoKG1peGVyX3dpZGdldC53aW5kb3csIEFDU19ITElORSk7CisJCXdhZGRjaChtaXhlcl93aWRnZXQud2luZG93LCBBQ1NfTFJDT1JORVIpOworCX0KKwlpZiAoY29udHJvbC0+ZmxhZ3MgJiAoVFlQRV9QVk9MVU1FIHwgVFlQRV9DVk9MVU1FKSkgeworCQlkb3VibGUgKCpnZXRfdm9sX2Z1bmMpKHNuZF9taXhlcl9lbGVtX3QgKiwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCk7CisKKwkJaWYgKGNvbnRyb2wtPmZsYWdzICYgVFlQRV9QVk9MVU1FKQorCQkJZ2V0X3ZvbF9mdW5jID0gZ2V0X25vcm1hbGl6ZWRfcGxheWJhY2tfdm9sdW1lOworCQllbHNlCisJCQlnZXRfdm9sX2Z1bmMgPSBnZXRfbm9ybWFsaXplZF9jYXB0dXJlX3ZvbHVtZTsKKwkJdm9sdW1lc1swXSA9IGdldF92b2xfZnVuYyhjb250cm9sLT5lbGVtLCBjb250cm9sLT52b2x1bWVfY2hhbm5lbHNbMF0pOworCQlpZiAoY29udHJvbC0+ZmxhZ3MgJiBIQVNfVk9MVU1FXzEpCisJCQl2b2x1bWVzWzFdID0gZ2V0X3ZvbF9mdW5jKGNvbnRyb2wtPmVsZW0sIGNvbnRyb2wtPnZvbHVtZV9jaGFubmVsc1sxXSk7CisJCWVsc2UKKwkJCXZvbHVtZXNbMV0gPSB2b2x1bWVzWzBdOworCisJCWlmIChjb250cm9sLT5mbGFncyAmIElTX0FDVElWRSkKKwkJCXdhdHRyc2V0KG1peGVyX3dpZGdldC53aW5kb3csIDApOworCQlmb3IgKGMgPSAwOyBjIDwgMjsgYysrKSB7CisJCQliYXJfaGVpZ2h0ID0gbHJpbnQodm9sdW1lc1tjXSAqIHZvbHVtZV9oZWlnaHQpOworCQkJZm9yIChpID0gMDsgaSA8IHZvbHVtZV9oZWlnaHQ7ICsraSkgeworCQkJCWNodHlwZSBjaDsKKwkJCQlpZiAoaSArIDEgPiBiYXJfaGVpZ2h0KQorCQkJCQljaCA9ICcgJyB8IChjb250cm9sLT5mbGFncyAmIElTX0FDVElWRSA/CisJCQkJCQkgICAgYXR0cl9jdGxfZnJhbWUgOiAwKTsKKwkJCQllbHNlIHsKKwkJCQkJY2ggPSBBQ1NfQ0tCT0FSRDsKKwkJCQkJaWYgKCEoY29udHJvbC0+ZmxhZ3MgJiBJU19BQ1RJVkUpKQorCQkJCQkJOworI2lmZGVmIFRSSUNPTE9SX1ZPTFVNRV9CQVIKKwkJCQkJZWxzZSBpZiAoaSA+IHZvbHVtZV9oZWlnaHQgKiA4IC8gMTApCisJCQkJCQljaCB8PSBhdHRyX2N0bF9iYXJfaGk7CisJCQkJCWVsc2UgaWYgKGkgPiB2b2x1bWVfaGVpZ2h0ICogNCAvIDEwKQorCQkJCQkJY2ggfD0gYXR0cl9jdGxfYmFyX21pOworI2VuZGlmCisJCQkJCWVsc2UKKwkJCQkJCWNoIHw9IGF0dHJfY3RsX2Jhcl9sbzsKKwkJCQl9CisJCQkJbXZ3YWRkY2gobWl4ZXJfd2lkZ2V0LndpbmRvdywgYmFzZV95IC0gaSAtIDEsCisJCQkJCSBmcmFtZV9sZWZ0ICsgYyArIDEsIGNoKTsKKwkJCX0KKwkJfQorCQlpZiAoY29udHJvbC0+ZmxhZ3MgJiBJU19BQ1RJVkUpCisJCQl3YXR0cnNldChtaXhlcl93aWRnZXQud2luZG93LCBhdHRyX21peGVyX2FjdGl2ZSk7CisJCWlmICghKGNvbnRyb2wtPmZsYWdzICYgSEFTX1ZPTFVNRV8xKSkgeworCQkJc3ByaW50ZihidWYsICIlZCIsIChpbnQpbHJpbnQodm9sdW1lc1swXSAqIDEwMCkpOworCQkJZGlzcGxheV9zdHJpbmdfaW5fZmllbGQodmFsdWVzX3ksIGZyYW1lX2xlZnQgLSAyLCBidWYsIDgsIEFMSUdOX0NFTlRFUik7CisJCX0gZWxzZSB7CisJCQltdndwcmludHcobWl4ZXJfd2lkZ2V0LndpbmRvdywgdmFsdWVzX3ksIGZyYW1lX2xlZnQgLSAyLAorCQkJCSAgIiUzZCIsIChpbnQpbHJpbnQodm9sdW1lc1swXSAqIDEwMCkpOworCQkJaWYgKGNvbnRyb2wtPmZsYWdzICYgSVNfQUNUSVZFKQorCQkJCXdhdHRyc2V0KG1peGVyX3dpZGdldC53aW5kb3csIGF0dHJfY3RsX2ZyYW1lKTsKKwkJCXdhZGRzdHIobWl4ZXJfd2lkZ2V0LndpbmRvdywgIjw+Iik7CisJCQlpZiAoY29udHJvbC0+ZmxhZ3MgJiBJU19BQ1RJVkUpCisJCQkJd2F0dHJzZXQobWl4ZXJfd2lkZ2V0LndpbmRvdywgYXR0cl9taXhlcl9hY3RpdmUpOworCQkJd3ByaW50dyhtaXhlcl93aWRnZXQud2luZG93LCAiJS0zZCIsIChpbnQpbHJpbnQodm9sdW1lc1sxXSAqIDEwMCkpOworCQl9CisJfQorCisJaWYgKGNvbnRyb2wtPmZsYWdzICYgVFlQRV9QU1dJVENIKSB7CisJCWVyciA9IHNuZF9taXhlcl9zZWxlbV9nZXRfcGxheWJhY2tfc3dpdGNoKGNvbnRyb2wtPmVsZW0sIGNvbnRyb2wtPnBzd2l0Y2hfY2hhbm5lbHNbMF0sICZzd2l0Y2hlc1swXSk7CisJCWlmIChlcnIgPj0gMCAmJiAoY29udHJvbC0+ZmxhZ3MgJiBIQVNfUFNXSVRDSF8xKSkKKwkJCWVyciA9IHNuZF9taXhlcl9zZWxlbV9nZXRfcGxheWJhY2tfc3dpdGNoKGNvbnRyb2wtPmVsZW0sIGNvbnRyb2wtPnBzd2l0Y2hfY2hhbm5lbHNbMV0sICZzd2l0Y2hlc1sxXSk7CisJCWVsc2UKKwkJCXN3aXRjaGVzWzFdID0gc3dpdGNoZXNbMF07CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuOworCQlpZiAoY29udHJvbC0+ZmxhZ3MgJiBJU19BQ1RJVkUpCisJCQl3YXR0cnNldChtaXhlcl93aWRnZXQud2luZG93LCAwKTsKKwkJbXZ3YWRkY2gobWl4ZXJfd2lkZ2V0LndpbmRvdywgYmFzZV95ICsgMSwgZnJhbWVfbGVmdCArIDEsCisJCQkgc3dpdGNoZXNbMF0KKwkJCSAvKiBUUkFOU0xBVE9SUzogcGxheWJhY2sgb247IG9uZSBjaGFyYWN0ZXIgKi8KKwkJCSA/IF8oIk8iKVswXSB8IChjb250cm9sLT5mbGFncyAmIElTX0FDVElWRSA/IGF0dHJfY3RsX25vbXV0ZSA6IDApCisJCQkgLyogVFJBTlNMQVRPUlM6IHBsYXliYWNrIG11dGVkOyBvbmUgY2hhcmFjdGVyICovCisJCQkgOiBfKCJNIilbMF0gfCAoY29udHJvbC0+ZmxhZ3MgJiBJU19BQ1RJVkUgPyBhdHRyX2N0bF9tdXRlIDogMCkpOworCQl3YWRkY2gobWl4ZXJfd2lkZ2V0LndpbmRvdywKKwkJICAgICAgIHN3aXRjaGVzWzFdCisJCSAgICAgICA/IF8oIk8iKVswXSB8IChjb250cm9sLT5mbGFncyAmIElTX0FDVElWRSA/IGF0dHJfY3RsX25vbXV0ZSA6IDApCisJCSAgICAgICA6IF8oIk0iKVswXSB8IChjb250cm9sLT5mbGFncyAmIElTX0FDVElWRSA/IGF0dHJfY3RsX211dGUgOiAwKSk7CisJfQorCisJaWYgKGNvbnRyb2wtPmZsYWdzICYgVFlQRV9DU1dJVENIKSB7CisJCWVyciA9IHNuZF9taXhlcl9zZWxlbV9nZXRfY2FwdHVyZV9zd2l0Y2goY29udHJvbC0+ZWxlbSwgY29udHJvbC0+Y3N3aXRjaF9jaGFubmVsc1swXSwgJnN3aXRjaGVzWzBdKTsKKwkJaWYgKGVyciA+PSAwICYmIChjb250cm9sLT5mbGFncyAmIEhBU19DU1dJVENIXzEpKQorCQkJZXJyID0gc25kX21peGVyX3NlbGVtX2dldF9jYXB0dXJlX3N3aXRjaChjb250cm9sLT5lbGVtLCBjb250cm9sLT5jc3dpdGNoX2NoYW5uZWxzWzFdLCAmc3dpdGNoZXNbMV0pOworCQllbHNlCisJCQlzd2l0Y2hlc1sxXSA9IHN3aXRjaGVzWzBdOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybjsKKwkJaWYgKGNvbnRyb2wtPmZsYWdzICYgSVNfQUNUSVZFKQorCQkJd2F0dHJzZXQobWl4ZXJfd2lkZ2V0LndpbmRvdywgc3dpdGNoZXNbMF0gPyBhdHRyX2N0bF9jYXB0dXJlIDogYXR0cl9jdGxfbm9jYXB0dXJlKTsKKwkJLyogVFJBTlNMQVRPUlM6ICJsZWZ0Ijsgbm8gbW9yZSB0aGFuIHR3byBjaGFyYWN0ZXJzICovCisJCWRpc3BsYXlfc3RyaW5nX2luX2ZpZWxkKGNzd2l0Y2hfeSAtIDEsIGZyYW1lX2xlZnQgLSAyLCBzd2l0Y2hlc1swXSA/IF8oIkwiKSA6ICIiLCAyLCBBTElHTl9SSUdIVCk7CisJCWlmIChjb250cm9sLT5mbGFncyAmIElTX0FDVElWRSkKKwkJCXdhdHRyc2V0KG1peGVyX3dpZGdldC53aW5kb3csIHN3aXRjaGVzWzFdID8gYXR0cl9jdGxfY2FwdHVyZSA6IGF0dHJfY3RsX25vY2FwdHVyZSk7CisJCS8qIFRSQU5TTEFUT1JTOiAicmlnaHQiOyBubyBtb3JlIHRoYW4gdHdvIGNoYXJhY3RlcnMgKi8KKwkJZGlzcGxheV9zdHJpbmdfaW5fZmllbGQoY3N3aXRjaF95IC0gMSwgZnJhbWVfbGVmdCArIDQsIHN3aXRjaGVzWzFdID8gXygiUiIpIDogIiIsIDIsIEFMSUdOX0xFRlQpOworCQkvKiBUUkFOU0xBVE9SUzogbm8gbW9yZSB0aGFuIGVpZ2h0IGNoYXJhY3RlcnMgKi8KKwkJcyA9IF8oIkNBUFRVUkUiKTsKKwkJaWYgKHN3aXRjaGVzWzBdIHx8IHN3aXRjaGVzWzFdKSB7CisJCQlpZiAoY29udHJvbC0+ZmxhZ3MgJiBJU19BQ1RJVkUpCisJCQkJd2F0dHJzZXQobWl4ZXJfd2lkZ2V0LndpbmRvdywgYXR0cl9jdGxfY2FwdHVyZSk7CisJCQlkaXNwbGF5X3N0cmluZ19pbl9maWVsZChjc3dpdGNoX3ksIGZyYW1lX2xlZnQgLSAyLCBzLCA4LCBBTElHTl9DRU5URVIpOworCQl9IGVsc2UgeworCQkJaSA9IGdldF9tYnNfd2lkdGgocyk7CisJCQlpZiAoaSA+IDgpCisJCQkJaSA9IDg7CisJCQltZW1zZXQoYnVmLCAnLScsIGkpOworCQkJYnVmW2ldID0gJ1wwJzsKKwkJCWlmIChjb250cm9sLT5mbGFncyAmIElTX0FDVElWRSkKKwkJCQl3YXR0cnNldChtaXhlcl93aWRnZXQud2luZG93LCBhdHRyX2N0bF9ub2NhcHR1cmUpOworCQkJZGlzcGxheV9zdHJpbmdfaW5fZmllbGQoY3N3aXRjaF95LCBmcmFtZV9sZWZ0IC0gMiwgYnVmLCA4LCBBTElHTl9DRU5URVIpOworCQl9CisJfQorCisJaWYgKGNvbnRyb2wtPmZsYWdzICYgVFlQRV9FTlVNKSB7CisJCWVyciA9IHNuZF9taXhlcl9zZWxlbV9nZXRfZW51bV9pdGVtKGNvbnRyb2wtPmVsZW0sIGZmcyhjb250cm9sLT5lbnVtX2NoYW5uZWxfYml0cykgLSAxLCAmaW5kZXgpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybjsKKwkJZXJyID0gc25kX21peGVyX3NlbGVtX2dldF9lbnVtX2l0ZW1fbmFtZShjb250cm9sLT5lbGVtLCBpbmRleCwgc2l6ZW9mIGJ1ZiAtIDEsIGJ1Zik7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuOworCQlpZiAoY29udHJvbC0+ZmxhZ3MgJiBJU19BQ1RJVkUpCisJCQl3YXR0cnNldChtaXhlcl93aWRnZXQud2luZG93LCBhdHRyX21peGVyX2FjdGl2ZSk7CisJCWRpc3BsYXlfc3RyaW5nX2NlbnRlcmVkX2luX2NvbnRyb2woYmFzZV95LCBjb2wsIGJ1ZiwgY29udHJvbF93aWR0aCk7CisJfQorCisJaWYgKGNvbnRyb2xfaW5kZXggPT0gZm9jdXNfY29udHJvbF9pbmRleCkgeworCQlpID0gZmlyc3RfY29udHJvbF94ICsgY29sICogKGNvbnRyb2xfd2lkdGggKyAxKSArIChjb250cm9sX3dpZHRoIC0gY29udHJvbF9uYW1lX3dpZHRoKSAvIDI7CisJCXdhdHRyc2V0KG1peGVyX3dpZGdldC53aW5kb3csIGF0dHJfY3RsX21hcmtfZm9jdXMpOworCQltdndhZGRjaChtaXhlcl93aWRnZXQud2luZG93LCBuYW1lX3ksIGkgLSAxLCAnPCcpOworCQltdndhZGRjaChtaXhlcl93aWRnZXQud2luZG93LCBuYW1lX3ksIGkgKyBjb250cm9sX25hbWVfd2lkdGgsICc+Jyk7CisJCWlmIChjb250cm9sLT5mbGFncyAmIElTX0FDVElWRSkKKwkJCXdhdHRyc2V0KG1peGVyX3dpZGdldC53aW5kb3csIGF0dHJfY3RsX2xhYmVsX2ZvY3VzKTsKKwkJZWxzZQorCQkJd2F0dHJzZXQobWl4ZXJfd2lkZ2V0LndpbmRvdywgYXR0cl9jdGxfbGFiZWxfaW5hY3RpdmUpOworCX0gZWxzZSB7CisJCWlmIChjb250cm9sLT5mbGFncyAmIElTX0FDVElWRSkKKwkJCXdhdHRyc2V0KG1peGVyX3dpZGdldC53aW5kb3csIGF0dHJfY3RsX2xhYmVsKTsKKwkJZWxzZQorCQkJd2F0dHJzZXQobWl4ZXJfd2lkZ2V0LndpbmRvdywgYXR0cl9jdGxfbGFiZWxfaW5hY3RpdmUpOworCX0KKwlkaXNwbGF5X3N0cmluZ19jZW50ZXJlZF9pbl9jb250cm9sKG5hbWVfeSwgY29sLCBjb250cm9sLT5uYW1lLCBjb250cm9sX25hbWVfd2lkdGgpOworCWlmIChjaGFubmVsX25hbWVfeSA+IG5hbWVfeSkgeworCQlpZiAoY29udHJvbC0+ZmxhZ3MgJiBJU19NVUxUSUNIKSB7CisJCQlzd2l0Y2ggKGNvbnRyb2wtPmZsYWdzICYgTVVMVElDSF9NQVNLKSB7CisJCQljYXNlIDA6CisJCQlkZWZhdWx0OgorCQkJCXMgPSBfKCJGcm9udCIpOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCXMgPSBfKCJSZWFyIik7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJcyA9IF8oIkNlbnRlciIpOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCXMgPSBfKCJXb29mZXIiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQlzID0gXygiU2lkZSIpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJcyA9ICIiOworCQkJd2F0dHJzZXQobWl4ZXJfd2lkZ2V0LndpbmRvdywgYXR0cl9taXhlcl9mcmFtZSk7CisJCX0KKwkJZGlzcGxheV9zdHJpbmdfY2VudGVyZWRfaW5fY29udHJvbChjaGFubmVsX25hbWVfeSwgY29sLCBzLAorCQkJCQkJICAgY29udHJvbF9uYW1lX3dpZHRoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRpc3BsYXlfc2Nyb2xsX2luZGljYXRvcnModm9pZCkKK3sKKwlpbnQgeTAsIHkxLCB5OworCWNodHlwZSBsZWZ0LCByaWdodDsKKworCWlmIChzY3JlZW5fdG9vX3NtYWxsKQorCQlyZXR1cm47CisJeTAgPSBzY3JlZW5fbGluZXMgKiAzIC8gODsKKwl5MSA9IHNjcmVlbl9saW5lcyAqIDUgLyA4OworCWxlZnQgPSBmaXJzdF92aXNpYmxlX2NvbnRyb2xfaW5kZXggPiAwID8gQUNTX0xBUlJPVyA6IEFDU19WTElORTsKKwlyaWdodCA9IGZpcnN0X3Zpc2libGVfY29udHJvbF9pbmRleCArIHZpc2libGVfY29udHJvbHMgPCBjb250cm9sc19jb3VudAorCQk/IEFDU19SQVJST1cgOiBBQ1NfVkxJTkU7CisJd2F0dHJzZXQobWl4ZXJfd2lkZ2V0LndpbmRvdywgYXR0cl9taXhlcl9mcmFtZSk7CisJZm9yICh5ID0geTA7IHkgPD0geTE7ICsreSkgeworCQltdndhZGRjaChtaXhlcl93aWRnZXQud2luZG93LCB5LCAwLCBsZWZ0KTsKKwkJbXZ3YWRkY2gobWl4ZXJfd2lkZ2V0LndpbmRvdywgeSwgc2NyZWVuX2NvbHMgLSAxLCByaWdodCk7CisJfQorfQorCit2b2lkIGRpc3BsYXlfY29udHJvbHModm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChmaXJzdF92aXNpYmxlX2NvbnRyb2xfaW5kZXggPiBjb250cm9sc19jb3VudCAtIHZpc2libGVfY29udHJvbHMpCisJCWZpcnN0X3Zpc2libGVfY29udHJvbF9pbmRleCA9IGNvbnRyb2xzX2NvdW50IC0gdmlzaWJsZV9jb250cm9sczsKKwlpZiAoZmlyc3RfdmlzaWJsZV9jb250cm9sX2luZGV4ID4gZm9jdXNfY29udHJvbF9pbmRleCkKKwkJZmlyc3RfdmlzaWJsZV9jb250cm9sX2luZGV4ID0gZm9jdXNfY29udHJvbF9pbmRleDsKKwllbHNlIGlmIChmaXJzdF92aXNpYmxlX2NvbnRyb2xfaW5kZXggPCBmb2N1c19jb250cm9sX2luZGV4IC0gdmlzaWJsZV9jb250cm9scyArIDEgJiYgdmlzaWJsZV9jb250cm9scykKKwkJZmlyc3RfdmlzaWJsZV9jb250cm9sX2luZGV4ID0gZm9jdXNfY29udHJvbF9pbmRleCAtIHZpc2libGVfY29udHJvbHMgKyAxOworCisJY2xlYXJfY29udHJvbHNfZGlzcGxheSgpOworCisJZGlzcGxheV9mb2N1c19pdGVtX2luZm8oKTsKKworCWlmIChjb250cm9sc19jb3VudCA+IDApIHsKKwkJaWYgKCFzY3JlZW5fdG9vX3NtYWxsKQorCQkJZm9yIChpID0gMDsgaSA8IHZpc2libGVfY29udHJvbHM7ICsraSkKKwkJCQlkaXNwbGF5X2NvbnRyb2woZmlyc3RfdmlzaWJsZV9jb250cm9sX2luZGV4ICsgaSk7CisJfSBlbHNlIGlmICh1bnBsdWdnZWQpIHsKKwkJZGlzcGxheV91bnBsdWdnZWQoKTsKKwl9IGVsc2UgaWYgKG1peGVyX2RldmljZV9uYW1lKSB7CisJCWRpc3BsYXlfbm9fY29udHJvbHMoKTsKKwl9CisJZGlzcGxheV9zY3JvbGxfaW5kaWNhdG9ycygpOworCWNvbnRyb2xzX2NoYW5nZWQgPSBGQUxTRTsKK30KKwordm9pZCBjb21wdXRlX2NvbnRyb2xzX2xheW91dCh2b2lkKQoreworCWJvb2wgYW55X3ZvbHVtZSwgYW55X3Bzd2l0Y2gsIGFueV9jc3dpdGNoLCBhbnlfbXVsdGljaDsKKwlpbnQgbWF4X3dpZHRoLCBuYW1lX2xlbjsKKwlpbnQgaGVpZ2h0LCBzcGFjZTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChjb250cm9sc19jb3VudCA9PSAwIHx8IHNjcmVlbl90b29fc21hbGwpIHsKKwkJdmlzaWJsZV9jb250cm9scyA9IDA7CisJCXJldHVybjsKKwl9CisKKwlhbnlfdm9sdW1lID0gRkFMU0U7CisJYW55X3Bzd2l0Y2ggPSBGQUxTRTsKKwlhbnlfY3N3aXRjaCA9IEZBTFNFOworCWFueV9tdWx0aWNoID0gRkFMU0U7CisJZm9yIChpID0gMDsgaSA8IGNvbnRyb2xzX2NvdW50OyArK2kpIHsKKwkJaWYgKGNvbnRyb2xzW2ldLmZsYWdzICYgKFRZUEVfUFZPTFVNRSB8IFRZUEVfQ1ZPTFVNRSkpCisJCQlhbnlfdm9sdW1lID0gMTsKKwkJaWYgKGNvbnRyb2xzW2ldLmZsYWdzICYgVFlQRV9QU1dJVENIKQorCQkJYW55X3Bzd2l0Y2ggPSAxOworCQlpZiAoY29udHJvbHNbaV0uZmxhZ3MgJiBUWVBFX0NTV0lUQ0gpCisJCQlhbnlfY3N3aXRjaCA9IDE7CisJCWlmIChjb250cm9sc1tpXS5mbGFncyAmIElTX01VTFRJQ0gpCisJCQlhbnlfbXVsdGljaCA9IDE7CisJfQorCisJbWF4X3dpZHRoID0gODsKKwlmb3IgKGkgPSAwOyBpIDwgY29udHJvbHNfY291bnQ7ICsraSkgeworCQluYW1lX2xlbiA9IHN0cmxlbihjb250cm9sc1tpXS5uYW1lKTsKKwkJaWYgKG5hbWVfbGVuID4gbWF4X3dpZHRoKQorCQkJbWF4X3dpZHRoID0gbmFtZV9sZW47CisJfQorCW1heF93aWR0aCA9IChtYXhfd2lkdGggKyAxKSAmIH4xOworCisJY29udHJvbF93aWR0aCA9IChzY3JlZW5fY29scyAtIDMgLSAoaW50KWNvbnRyb2xzX2NvdW50KSAvIGNvbnRyb2xzX2NvdW50OworCWlmIChjb250cm9sX3dpZHRoIDwgOCkKKwkJY29udHJvbF93aWR0aCA9IDg7CisJaWYgKGNvbnRyb2xfd2lkdGggPiBtYXhfd2lkdGgpCisJCWNvbnRyb2xfd2lkdGggPSBtYXhfd2lkdGg7CisJaWYgKGNvbnRyb2xfd2lkdGggPiBzY3JlZW5fY29scyAtIDQpCisJCWNvbnRyb2xfd2lkdGggPSBzY3JlZW5fY29scyAtIDQ7CisKKwl2aXNpYmxlX2NvbnRyb2xzID0gKHNjcmVlbl9jb2xzIC0gMykgLyAoY29udHJvbF93aWR0aCArIDEpOworCWlmICh2aXNpYmxlX2NvbnRyb2xzID4gY29udHJvbHNfY291bnQpCisJCXZpc2libGVfY29udHJvbHMgPSBjb250cm9sc19jb3VudDsKKworCWZpcnN0X2NvbnRyb2xfeCA9IDIgKyAoc2NyZWVuX2NvbHMgLSAzIC0gdmlzaWJsZV9jb250cm9scyAqIChjb250cm9sX3dpZHRoICsgMSkpIC8gMjsKKworCWlmIChjb250cm9sX3dpZHRoIDwgbWF4X3dpZHRoKQorCQljb250cm9sX25hbWVfd2lkdGggPSBjb250cm9sX3dpZHRoOworCWVsc2UKKwkJY29udHJvbF9uYW1lX3dpZHRoID0gbWF4X3dpZHRoOworCisJaGVpZ2h0ID0gMjsKKwlpZiAoYW55X3ZvbHVtZSkKKwkJaGVpZ2h0ICs9IDI7CisJaWYgKGFueV9wc3dpdGNoKQorCQloZWlnaHQgKz0gMjsKKwlpZiAoYW55X2Nzd2l0Y2gpCisJCWhlaWdodCArPSAxOworCWlmIChhbnlfbXVsdGljaCkKKwkJaGVpZ2h0ICs9IDE7CisJaWYgKGFueV92b2x1bWUpIHsKKwkJc3BhY2UgPSBzY3JlZW5fbGluZXMgLSA2IC0gaGVpZ2h0OworCQlpZiAoc3BhY2UgPD0gMSkKKwkJCXZvbHVtZV9oZWlnaHQgPSAxOworCQllbHNlIGlmIChzcGFjZSA8PSAxMCkKKwkJCXZvbHVtZV9oZWlnaHQgPSBzcGFjZTsKKwkJZWxzZQorCQkJdm9sdW1lX2hlaWdodCA9IDEwICsgKHNwYWNlIC0gMTApIC8gMjsKKwkJaGVpZ2h0ICs9IHZvbHVtZV9oZWlnaHQ7CisJfQorCisJc3BhY2UgPSBzY3JlZW5fbGluZXMgLSA2IC0gaGVpZ2h0OworCWNoYW5uZWxfbmFtZV95ID0gc2NyZWVuX2xpbmVzIC0gMiAtIHNwYWNlIC8gMjsKKwluYW1lX3kgPSBjaGFubmVsX25hbWVfeSAtIGFueV9tdWx0aWNoOworCXZhbHVlc195ID0gbmFtZV95IC0gYW55X3ZvbHVtZTsKKwljc3dpdGNoX3kgPSB2YWx1ZXNfeSAtIGFueV9jc3dpdGNoOworCWJhc2VfeSA9IGNzd2l0Y2hfeSAtIDEgLSAyICogYW55X3Bzd2l0Y2g7Cit9CmRpZmYgLS1naXQgYS9hbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5oIGIvYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDY1NjcwCi0tLSAvZGV2L251bGwKKysrIGIvYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIE1JWEVSX0RJU1BMQVlfSF9JTkNMVURFRAorI2RlZmluZSBNSVhFUl9ESVNQTEFZX0hfSU5DTFVERUQKKwordm9pZCBpbml0X21peGVyX2xheW91dCh2b2lkKTsKK3ZvaWQgZGlzcGxheV9jYXJkX2luZm8odm9pZCk7Cit2b2lkIGRpc3BsYXlfdmlld19tb2RlKHZvaWQpOwordm9pZCBkaXNwbGF5X2NvbnRyb2xzKHZvaWQpOwordm9pZCBjb21wdXRlX2NvbnRyb2xzX2xheW91dCh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmMgYi9hbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FhZjc3NwotLS0gL2Rldi9udWxsCisrKyBiL2Fsc2FtaXhlci9taXhlcl93aWRnZXQuYwpAQCAtMCwwICsxLDY2MSBAQAorLyoKKyAqIG1peGVyX3dpZGdldC5jIC0gbWl4ZXIgd2lkZ2V0IGFuZCBrZXlzIGhhbmRsaW5nCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgsMTk5OSBUaW0gSmFuaWsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgICAgICBDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJhY29uZmlnLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxhbHNhL2Fzb3VuZGxpYi5oPgorI2luY2x1ZGUgImdldHRleHRfY3Vyc2VzLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiZGllLmgiCisjaW5jbHVkZSAibWVtLmgiCisjaW5jbHVkZSAiY29sb3JzLmgiCisjaW5jbHVkZSAid2lkZ2V0LmgiCisjaW5jbHVkZSAidGV4dGJveC5oIgorI2luY2x1ZGUgInByb2NfZmlsZXMuaCIKKyNpbmNsdWRlICJjYXJkX3NlbGVjdC5oIgorI2luY2x1ZGUgInZvbHVtZV9tYXBwaW5nLmgiCisjaW5jbHVkZSAibWl4ZXJfY29udHJvbHMuaCIKKyNpbmNsdWRlICJtaXhlcl9kaXNwbGF5LmgiCisjaW5jbHVkZSAibWl4ZXJfd2lkZ2V0LmgiCisKK3NuZF9taXhlcl90ICptaXhlcjsKK2NoYXIgKm1peGVyX2RldmljZV9uYW1lOworYm9vbCB1bnBsdWdnZWQ7CisKK3N0cnVjdCB3aWRnZXQgbWl4ZXJfd2lkZ2V0OworCitlbnVtIHZpZXdfbW9kZSB2aWV3X21vZGU7CisKK2ludCBmb2N1c19jb250cm9sX2luZGV4Oworc25kX21peGVyX3NlbGVtX2lkX3QgKmN1cnJlbnRfc2VsZW1faWQ7Cit1bnNpZ25lZCBpbnQgY3VycmVudF9jb250cm9sX2ZsYWdzOworCitib29sIGNvbnRyb2xzX2NoYW5nZWQ7CisKK2VudW0gY2hhbm5lbF9tYXNrIHsKKwlMRUZUID0gMSwKKwlSSUdIVCA9IDIsCit9OworCitzdGF0aWMgaW50IGVsZW1fY2FsbGJhY2soc25kX21peGVyX2VsZW1fdCAqZWxlbSwgdW5zaWduZWQgaW50IG1hc2spCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAobWFzayAmIChTTkRfQ1RMX0VWRU5UX01BU0tfUkVNT1ZFIHwKKwkJICAgIFNORF9DVExfRVZFTlRfTUFTS19JTkZPIHwKKwkJICAgIFNORF9DVExfRVZFTlRfTUFTS19WQUxVRSkpCisJCWNvbnRyb2xzX2NoYW5nZWQgPSBUUlVFOworCisJaWYgKG1hc2sgJiBTTkRfQ1RMX0VWRU5UX01BU0tfSU5GTykKKwkJZm9yIChpID0gMDsgaSA8IGNvbnRyb2xzX2NvdW50OyArK2kpCisJCQlpZiAoY29udHJvbHNbaV0uZWxlbSA9PSBlbGVtKSB7CisJCQkJY29udHJvbHNbaV0uZmxhZ3MgJj0gfklTX0FDVElWRTsKKwkJCQlpZiAoc25kX21peGVyX3NlbGVtX2lzX2FjdGl2ZShjb250cm9sc1tpXS5lbGVtKSkKKwkJCQkJY29udHJvbHNbaV0uZmxhZ3MgfD0gSVNfQUNUSVZFOworCQkJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWl4ZXJfY2FsbGJhY2soc25kX21peGVyX3QgKm1peGVyLCB1bnNpZ25lZCBpbnQgbWFzaywgc25kX21peGVyX2VsZW1fdCAqZWxlbSkKK3sKKwlpZiAobWFzayAmIFNORF9DVExfRVZFTlRfTUFTS19BREQpIHsKKwkJc25kX21peGVyX2VsZW1fc2V0X2NhbGxiYWNrKGVsZW0sIGVsZW1fY2FsbGJhY2spOworCQljb250cm9sc19jaGFuZ2VkID0gVFJVRTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY3JlYXRlX21peGVyX29iamVjdChzdHJ1Y3Qgc25kX21peGVyX3NlbGVtX3JlZ29wdCAqc2VsZW1fcmVnb3B0KQoreworCWludCBlcnI7CisKKwllcnIgPSBzbmRfbWl4ZXJfb3BlbigmbWl4ZXIsIDApOworCWlmIChlcnIgPCAwKQorCQlmYXRhbF9hbHNhX2Vycm9yKF8oImNhbm5vdCBvcGVuIG1peGVyIiksIGVycik7CisKKwltaXhlcl9kZXZpY2VfbmFtZSA9IGNzdHJkdXAoc2VsZW1fcmVnb3B0LT5kZXZpY2UpOworCWVyciA9IHNuZF9taXhlcl9zZWxlbV9yZWdpc3RlcihtaXhlciwgc2VsZW1fcmVnb3B0LCBOVUxMKTsKKwlpZiAoZXJyIDwgMCkKKwkJZmF0YWxfYWxzYV9lcnJvcihfKCJjYW5ub3Qgb3BlbiBtaXhlciIpLCBlcnIpOworCisJc25kX21peGVyX3NldF9jYWxsYmFjayhtaXhlciwgbWl4ZXJfY2FsbGJhY2spOworCisJZXJyID0gc25kX21peGVyX2xvYWQobWl4ZXIpOworCWlmIChlcnIgPCAwKQorCQlmYXRhbF9hbHNhX2Vycm9yKF8oImNhbm5vdCBsb2FkIG1peGVyIGNvbnRyb2xzIiksIGVycik7CisKKwllcnIgPSBzbmRfbWl4ZXJfc2VsZW1faWRfbWFsbG9jKCZjdXJyZW50X3NlbGVtX2lkKTsKKwlpZiAoZXJyIDwgMCkKKwkJZmF0YWxfZXJyb3IoIm91dCBvZiBtZW1vcnkiKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3ZpZXdfbW9kZShlbnVtIHZpZXdfbW9kZSBtKQoreworCXZpZXdfbW9kZSA9IG07CisJY3JlYXRlX2NvbnRyb2xzKCk7Cit9CisKK3N0YXRpYyB2b2lkIGNsb3NlX2hjdGwodm9pZCkKK3sKKwlmcmVlX2NvbnRyb2xzKCk7CisJaWYgKG1peGVyX2RldmljZV9uYW1lKSB7CisJCXNuZF9taXhlcl9kZXRhY2gobWl4ZXIsIG1peGVyX2RldmljZV9uYW1lKTsKKwkJZnJlZShtaXhlcl9kZXZpY2VfbmFtZSk7CisJCW1peGVyX2RldmljZV9uYW1lID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3VucGx1Z2dlZCh2b2lkKQoreworCXNuZF9oY3RsX3QgKmhjdGw7CisJc25kX2N0bF90ICpjdGw7CisJdW5zaWduZWQgaW50IHN0YXRlOworCWludCBlcnI7CisKKwl1bnBsdWdnZWQgPSBGQUxTRTsKKwlpZiAobWl4ZXJfZGV2aWNlX25hbWUpIHsKKwkJZXJyID0gc25kX21peGVyX2dldF9oY3RsKG1peGVyLCBtaXhlcl9kZXZpY2VfbmFtZSwgJmhjdGwpOworCQlpZiAoZXJyID49IDApIHsKKwkJCWN0bCA9IHNuZF9oY3RsX2N0bChoY3RsKTsKKwkJCS8qIGp1c3QgYW55IHJhbmRvbSBmdW5jdGlvbiB0aGF0IGRvZXMgYW4gaW9jdGwoKSAqLworCQkJZXJyID0gc25kX2N0bF9nZXRfcG93ZXJfc3RhdGUoY3RsLCAmc3RhdGUpOworCQkJaWYgKGVyciA9PSAtRU5PREVWKQorCQkJCXVucGx1Z2dlZCA9IFRSVUU7CisJCX0KKwl9Cit9CisKK3ZvaWQgY2xvc2VfbWl4ZXJfZGV2aWNlKHZvaWQpCit7CisJY2hlY2tfdW5wbHVnZ2VkKCk7CisJY2xvc2VfaGN0bCgpOworCisJZGlzcGxheV9jYXJkX2luZm8oKTsKKwlzZXRfdmlld19tb2RlKHZpZXdfbW9kZSk7Cit9CisKK2Jvb2wgc2VsZWN0X2NhcmRfYnlfbmFtZShjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkKK3sKKwlpbnQgZXJyOworCWJvb2wgb3BlbmVkOworCWNoYXIgKm1zZzsKKworCWNsb3NlX2hjdGwoKTsKKwl1bnBsdWdnZWQgPSBGQUxTRTsKKworCW9wZW5lZCA9IEZBTFNFOworCWlmIChkZXZpY2VfbmFtZSkgeworCQllcnIgPSBzbmRfbWl4ZXJfYXR0YWNoKG1peGVyLCBkZXZpY2VfbmFtZSk7CisJCWlmIChlcnIgPj0gMCkKKwkJCW9wZW5lZCA9IFRSVUU7CisJCWVsc2UgeworCQkJbXNnID0gY2FzcHJpbnRmKF8oIkNhbm5vdCBvcGVuIG1peGVyIGRldmljZSAnJXMnLiIpLCBkZXZpY2VfbmFtZSk7CisJCQlzaG93X2Fsc2FfZXJyb3IobXNnLCBlcnIpOworCQkJZnJlZShtc2cpOworCQl9CisJfQorCWlmIChvcGVuZWQpIHsKKwkJbWl4ZXJfZGV2aWNlX25hbWUgPSBjc3RyZHVwKGRldmljZV9uYW1lKTsKKworCQllcnIgPSBzbmRfbWl4ZXJfbG9hZChtaXhlcik7CisJCWlmIChlcnIgPCAwKQorCQkJZmF0YWxfYWxzYV9lcnJvcihfKCJjYW5ub3QgbG9hZCBtaXhlciBjb250cm9scyIpLCBlcnIpOworCX0KKworCWRpc3BsYXlfY2FyZF9pbmZvKCk7CisJc2V0X3ZpZXdfbW9kZSh2aWV3X21vZGUpOworCXJldHVybiBvcGVuZWQ7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfaGVscCh2b2lkKQoreworCWNvbnN0IGNoYXIgKmhlbHBbXSA9IHsKKwkJXygiRXNjICAgICBFeGl0IiksCisJCV8oIkYxID8gSCAgSGVscCIpLAorCQlfKCJGMiAvICAgIFN5c3RlbSBpbmZvcm1hdGlvbiIpLAorCQlfKCJGMyAgICAgIFNob3cgcGxheWJhY2sgY29udHJvbHMiKSwKKwkJXygiRjQgICAgICBTaG93IGNhcHR1cmUgY29udHJvbHMiKSwKKwkJXygiRjUgICAgICBTaG93IGFsbCBjb250cm9scyIpLAorCQlfKCJUYWIgICAgIFRvZ2dsZSB2aWV3IG1vZGUgKEYzL0Y0L0Y1KSIpLAorCQlfKCJGNiBTICAgIFNlbGVjdCBzb3VuZCBjYXJkIiksCisJCV8oIkwgICAgICAgUmVkcmF3IHNjcmVlbiIpLAorCQkiIiwKKwkJXygiTGVmdCAgICBNb3ZlIHRvIHRoZSBwcmV2aW91cyBjb250cm9sIiksCisJCV8oIlJpZ2h0ICAgTW92ZSB0byB0aGUgbmV4dCBjb250cm9sIiksCisJCSIiLAorCQlfKCJVcC9Eb3duICAgIENoYW5nZSB2b2x1bWUiKSwKKwkJXygiKyAtICAgICAgICBDaGFuZ2Ugdm9sdW1lIiksCisJCV8oIlBhZ2UgVXAvRG4gQ2hhbmdlIHZvbHVtZSBpbiBiaWcgc3RlcHMiKSwKKwkJXygiRW5kICAgICAgICBTZXQgdm9sdW1lIHRvIDAlIiksCisJCV8oIjAtOSAgICAgICAgU2V0IHZvbHVtZSB0byAwJS05MCUiKSwKKwkJXygiUSBXIEUgICAgICBJbmNyZWFzZSBsZWZ0L2JvdGgvcmlnaHQgdm9sdW1lcyIpLAorCQkvKiBUUkFOU0xBVE9SUzogb3IgWSBpbnN0ZWFkIG9mIFogKi8KKwkJXygiWiBYIEMgICAgICBEZWNyZWFzZSBsZWZ0L2JvdGgvcmlnaHQgdm9sdW1lcyIpLAorCQlfKCJCICAgICAgICAgIEJhbGFuY2UgbGVmdCBhbmQgcmlnaHQgdm9sdW1lcyIpLAorCQkiIiwKKwkJXygiTSAgICAgICAgICBUb2dnbGUgbXV0ZSIpLAorCQkvKiBUUkFOU0xBVE9SUzogb3IgLCAuICovCisJCV8oIjwgPiAgICAgICAgVG9nZ2xlIGxlZnQvcmlnaHQgbXV0ZSIpLAorCQkiIiwKKwkJXygiU3BhY2UgICAgICBUb2dnbGUgY2FwdHVyZSIpLAorCQkvKiBUUkFOU0xBVE9SUzogb3IgSW5zZXJ0IERlbGV0ZSAqLworCQlfKCI7ICcgICAgICAgIFRvZ2dsZSBsZWZ0L3JpZ2h0IGNhcHR1cmUiKSwKKwkJIiIsCisJCV8oIkF1dGhvcnM6IiksCisJCV8oIiAgVGltIEphbmlrIiksCisJCV8oIiAgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4iKSwKKwkJXygiICBDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4iKSwKKwl9OworCXNob3dfdGV4dChoZWxwLCBBUlJBWV9TSVpFKGhlbHApLCBfKCJIZWxwIikpOworfQorCit2b2lkIHJlZm9jdXNfY29udHJvbCh2b2lkKQoreworCWlmIChmb2N1c19jb250cm9sX2luZGV4IDwgY29udHJvbHNfY291bnQpIHsKKwkJc25kX21peGVyX3NlbGVtX2dldF9pZChjb250cm9sc1tmb2N1c19jb250cm9sX2luZGV4XS5lbGVtLCBjdXJyZW50X3NlbGVtX2lkKTsKKwkJY3VycmVudF9jb250cm9sX2ZsYWdzID0gY29udHJvbHNbZm9jdXNfY29udHJvbF9pbmRleF0uZmxhZ3M7CisJfQorCisJZGlzcGxheV9jb250cm9scygpOworfQorCitzdGF0aWMgc3RydWN0IGNvbnRyb2wgKmdldF9mb2N1c19jb250cm9sKHVuc2lnbmVkIGludCB0eXBlKQoreworCWlmIChmb2N1c19jb250cm9sX2luZGV4ID49IDAgJiYKKwkgICAgZm9jdXNfY29udHJvbF9pbmRleCA8IGNvbnRyb2xzX2NvdW50ICYmCisJICAgIChjb250cm9sc1tmb2N1c19jb250cm9sX2luZGV4XS5mbGFncyAmIElTX0FDVElWRSkgJiYKKwkgICAgKGNvbnRyb2xzW2ZvY3VzX2NvbnRyb2xfaW5kZXhdLmZsYWdzICYgdHlwZSkpCisJCXJldHVybiAmY29udHJvbHNbZm9jdXNfY29udHJvbF9pbmRleF07CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgY2hhbmdlX2VudW1fdG9fcGVyY2VudChzdHJ1Y3QgY29udHJvbCAqY29udHJvbCwgaW50IHZhbHVlKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBpbmRleDsKKwl1bnNpZ25lZCBpbnQgbmV3X2luZGV4OworCWludCBpdGVtczsKKwlpbnQgZXJyOworCisJaSA9IGZmcyhjb250cm9sLT5lbnVtX2NoYW5uZWxfYml0cykgLSAxOworCWVyciA9IHNuZF9taXhlcl9zZWxlbV9nZXRfZW51bV9pdGVtKGNvbnRyb2wtPmVsZW0sIGksICZpbmRleCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybjsKKwluZXdfaW5kZXggPSBpbmRleDsKKwlpZiAodmFsdWUgPT0gMCkgeworCQluZXdfaW5kZXggPSAwOworCX0gZWxzZSBpZiAodmFsdWUgPT0gMTAwKSB7CisJCWl0ZW1zID0gc25kX21peGVyX3NlbGVtX2dldF9lbnVtX2l0ZW1zKGNvbnRyb2wtPmVsZW0pOworCQlpZiAoaXRlbXMgPCAxKQorCQkJcmV0dXJuOworCQluZXdfaW5kZXggPSBpdGVtcyAtIDE7CisJfQorCWlmIChuZXdfaW5kZXggPT0gaW5kZXgpCisJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDw9IFNORF9NSVhFUl9TQ0hOX0xBU1Q7ICsraSkKKwkJaWYgKGNvbnRyb2wtPmVudW1fY2hhbm5lbF9iaXRzICYgKDEgPDwgaSkpCisJCQlzbmRfbWl4ZXJfc2VsZW1fc2V0X2VudW1faXRlbShjb250cm9sLT5lbGVtLCBpLCBuZXdfaW5kZXgpOworfQorCitzdGF0aWMgdm9pZCBjaGFuZ2VfZW51bV9yZWxhdGl2ZShzdHJ1Y3QgY29udHJvbCAqY29udHJvbCwgaW50IGRlbHRhKQoreworCWludCBpdGVtczsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJaW50IG5ld19pbmRleDsKKwlpbnQgZXJyOworCisJaXRlbXMgPSBzbmRfbWl4ZXJfc2VsZW1fZ2V0X2VudW1faXRlbXMoY29udHJvbC0+ZWxlbSk7CisJaWYgKGl0ZW1zIDwgMSkKKwkJcmV0dXJuOworCWVyciA9IHNuZF9taXhlcl9zZWxlbV9nZXRfZW51bV9pdGVtKGNvbnRyb2wtPmVsZW0sIDAsICZpbmRleCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybjsKKwluZXdfaW5kZXggPSAoaW50KWluZGV4ICsgZGVsdGE7CisJaWYgKG5ld19pbmRleCA8IDApCisJCW5ld19pbmRleCA9IDA7CisJZWxzZSBpZiAobmV3X2luZGV4ID49IGl0ZW1zKQorCQluZXdfaW5kZXggPSBpdGVtcyAtIDE7CisJaWYgKG5ld19pbmRleCA9PSBpbmRleCkKKwkJcmV0dXJuOworCWZvciAoaSA9IDA7IGkgPD0gU05EX01JWEVSX1NDSE5fTEFTVDsgKytpKQorCQlpZiAoY29udHJvbC0+ZW51bV9jaGFubmVsX2JpdHMgJiAoMSA8PCBpKSkKKwkJCXNuZF9taXhlcl9zZWxlbV9zZXRfZW51bV9pdGVtKGNvbnRyb2wtPmVsZW0sIGksIG5ld19pbmRleCk7Cit9CisKK3N0YXRpYyB2b2lkIGNoYW5nZV92b2x1bWVfdG9fcGVyY2VudChzdHJ1Y3QgY29udHJvbCAqY29udHJvbCwgaW50IHZhbHVlLCB1bnNpZ25lZCBpbnQgY2hhbm5lbHMpCit7CisJaW50ICgqc2V0X2Z1bmMpKHNuZF9taXhlcl9lbGVtX3QgKiwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCwgZG91YmxlLCBpbnQpOworCisJaWYgKCEoY29udHJvbC0+ZmxhZ3MgJiBIQVNfVk9MVU1FXzEpKQorCQljaGFubmVscyA9IExFRlQ7CisJaWYgKGNvbnRyb2wtPmZsYWdzICYgVFlQRV9QVk9MVU1FKQorCQlzZXRfZnVuYyA9IHNldF9ub3JtYWxpemVkX3BsYXliYWNrX3ZvbHVtZTsKKwllbHNlCisJCXNldF9mdW5jID0gc2V0X25vcm1hbGl6ZWRfY2FwdHVyZV92b2x1bWU7CisJaWYgKGNoYW5uZWxzICYgTEVGVCkKKwkJc2V0X2Z1bmMoY29udHJvbC0+ZWxlbSwgY29udHJvbC0+dm9sdW1lX2NoYW5uZWxzWzBdLCB2YWx1ZSAvIDEwMC4wLCAwKTsKKwlpZiAoY2hhbm5lbHMgJiBSSUdIVCkKKwkJc2V0X2Z1bmMoY29udHJvbC0+ZWxlbSwgY29udHJvbC0+dm9sdW1lX2NoYW5uZWxzWzFdLCB2YWx1ZSAvIDEwMC4wLCAwKTsKK30KKworc3RhdGljIGRvdWJsZSBjbGFtcF92b2x1bWUoZG91YmxlIHYpCit7CisJaWYgKHYgPCAwKQorCQlyZXR1cm4gMDsKKwlpZiAodiA+IDEpCisJCXJldHVybiAxOworCXJldHVybiB2OworfQorCitzdGF0aWMgdm9pZCBjaGFuZ2Vfdm9sdW1lX3JlbGF0aXZlKHN0cnVjdCBjb250cm9sICpjb250cm9sLCBpbnQgZGVsdGEsIHVuc2lnbmVkIGludCBjaGFubmVscykKK3sKKwlkb3VibGUgKCpnZXRfZnVuYykoc25kX21peGVyX2VsZW1fdCAqLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90KTsKKwlpbnQgKCpzZXRfZnVuYykoc25kX21peGVyX2VsZW1fdCAqLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90LCBkb3VibGUsIGludCk7CisJZG91YmxlIGxlZnQsIHJpZ2h0OworCWludCBkaXI7CisKKwlpZiAoIShjb250cm9sLT5mbGFncyAmIEhBU19WT0xVTUVfMSkpCisJCWNoYW5uZWxzID0gTEVGVDsKKwlpZiAoY29udHJvbC0+ZmxhZ3MgJiBUWVBFX1BWT0xVTUUpIHsKKwkJZ2V0X2Z1bmMgPSBnZXRfbm9ybWFsaXplZF9wbGF5YmFja192b2x1bWU7CisJCXNldF9mdW5jID0gc2V0X25vcm1hbGl6ZWRfcGxheWJhY2tfdm9sdW1lOworCX0gZWxzZSB7CisJCWdldF9mdW5jID0gZ2V0X25vcm1hbGl6ZWRfY2FwdHVyZV92b2x1bWU7CisJCXNldF9mdW5jID0gc2V0X25vcm1hbGl6ZWRfY2FwdHVyZV92b2x1bWU7CisJfQorCWlmIChjaGFubmVscyAmIExFRlQpCisJCWxlZnQgPSBnZXRfZnVuYyhjb250cm9sLT5lbGVtLCBjb250cm9sLT52b2x1bWVfY2hhbm5lbHNbMF0pOworCWlmIChjaGFubmVscyAmIFJJR0hUKQorCQlyaWdodCA9IGdldF9mdW5jKGNvbnRyb2wtPmVsZW0sIGNvbnRyb2wtPnZvbHVtZV9jaGFubmVsc1sxXSk7CisJZGlyID0gZGVsdGEgPiAwID8gMSA6IC0xOworCWlmIChjaGFubmVscyAmIExFRlQpIHsKKwkJbGVmdCA9IGNsYW1wX3ZvbHVtZShsZWZ0ICsgZGVsdGEgLyAxMDAuMCk7CisJCXNldF9mdW5jKGNvbnRyb2wtPmVsZW0sIGNvbnRyb2wtPnZvbHVtZV9jaGFubmVsc1swXSwgbGVmdCwgZGlyKTsKKwl9CisJaWYgKGNoYW5uZWxzICYgUklHSFQpIHsKKwkJcmlnaHQgPSBjbGFtcF92b2x1bWUocmlnaHQgKyBkZWx0YSAvIDEwMC4wKTsKKwkJc2V0X2Z1bmMoY29udHJvbC0+ZWxlbSwgY29udHJvbC0+dm9sdW1lX2NoYW5uZWxzWzFdLCByaWdodCwgZGlyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNoYW5nZV9jb250cm9sX3RvX3BlcmNlbnQoaW50IHZhbHVlLCB1bnNpZ25lZCBpbnQgY2hhbm5lbHMpCit7CisJc3RydWN0IGNvbnRyb2wgKmNvbnRyb2w7CisKKwljb250cm9sID0gZ2V0X2ZvY3VzX2NvbnRyb2woVFlQRV9QVk9MVU1FIHwgVFlQRV9DVk9MVU1FIHwgVFlQRV9FTlVNKTsKKwlpZiAoIWNvbnRyb2wpCisJCXJldHVybjsKKwlpZiAoY29udHJvbC0+ZmxhZ3MgJiBUWVBFX0VOVU0pCisJCWNoYW5nZV9lbnVtX3RvX3BlcmNlbnQoY29udHJvbCwgdmFsdWUpOworCWVsc2UKKwkJY2hhbmdlX3ZvbHVtZV90b19wZXJjZW50KGNvbnRyb2wsIHZhbHVlLCBjaGFubmVscyk7CisJZGlzcGxheV9jb250cm9scygpOworfQorCitzdGF0aWMgdm9pZCBjaGFuZ2VfY29udHJvbF9yZWxhdGl2ZShpbnQgZGVsdGEsIHVuc2lnbmVkIGludCBjaGFubmVscykKK3sKKwlzdHJ1Y3QgY29udHJvbCAqY29udHJvbDsKKworCWNvbnRyb2wgPSBnZXRfZm9jdXNfY29udHJvbChUWVBFX1BWT0xVTUUgfCBUWVBFX0NWT0xVTUUgfCBUWVBFX0VOVU0pOworCWlmICghY29udHJvbCkKKwkJcmV0dXJuOworCWlmIChjb250cm9sLT5mbGFncyAmIFRZUEVfRU5VTSkKKwkJY2hhbmdlX2VudW1fcmVsYXRpdmUoY29udHJvbCwgZGVsdGEpOworCWVsc2UKKwkJY2hhbmdlX3ZvbHVtZV9yZWxhdGl2ZShjb250cm9sLCBkZWx0YSwgY2hhbm5lbHMpOworCWRpc3BsYXlfY29udHJvbHMoKTsKK30KKworc3RhdGljIHZvaWQgdG9nZ2xlX3N3aXRjaGVzKHVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgY2hhbm5lbHMpCit7CisJc3RydWN0IGNvbnRyb2wgKmNvbnRyb2w7CisJdW5zaWduZWQgaW50IHN3aXRjaF8xX21hc2s7CisJaW50ICgqZ2V0X2Z1bmMpKHNuZF9taXhlcl9lbGVtX3QgKiwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCwgaW50ICopOworCWludCAoKnNldF9mdW5jKShzbmRfbWl4ZXJfZWxlbV90ICosIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QsIGludCk7CisJc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsX2lkc1syXTsKKwlpbnQgbGVmdCwgcmlnaHQ7CisJaW50IGVycjsKKworCWNvbnRyb2wgPSBnZXRfZm9jdXNfY29udHJvbCh0eXBlKTsKKwlpZiAoIWNvbnRyb2wpCisJCXJldHVybjsKKwlpZiAodHlwZSA9PSBUWVBFX1BTV0lUQ0gpIHsKKwkJc3dpdGNoXzFfbWFzayA9IEhBU19QU1dJVENIXzE7CisJCWdldF9mdW5jID0gc25kX21peGVyX3NlbGVtX2dldF9wbGF5YmFja19zd2l0Y2g7CisJCXNldF9mdW5jID0gc25kX21peGVyX3NlbGVtX3NldF9wbGF5YmFja19zd2l0Y2g7CisJCWNoYW5uZWxfaWRzWzBdID0gY29udHJvbC0+cHN3aXRjaF9jaGFubmVsc1swXTsKKwkJY2hhbm5lbF9pZHNbMV0gPSBjb250cm9sLT5wc3dpdGNoX2NoYW5uZWxzWzFdOworCX0gZWxzZSB7CisJCXN3aXRjaF8xX21hc2sgPSBIQVNfQ1NXSVRDSF8xOworCQlnZXRfZnVuYyA9IHNuZF9taXhlcl9zZWxlbV9nZXRfY2FwdHVyZV9zd2l0Y2g7CisJCXNldF9mdW5jID0gc25kX21peGVyX3NlbGVtX3NldF9jYXB0dXJlX3N3aXRjaDsKKwkJY2hhbm5lbF9pZHNbMF0gPSBjb250cm9sLT5jc3dpdGNoX2NoYW5uZWxzWzBdOworCQljaGFubmVsX2lkc1sxXSA9IGNvbnRyb2wtPmNzd2l0Y2hfY2hhbm5lbHNbMV07CisJfQorCWlmICghKGNvbnRyb2wtPmZsYWdzICYgc3dpdGNoXzFfbWFzaykpCisJCWNoYW5uZWxzID0gTEVGVDsKKwlpZiAoY2hhbm5lbHMgJiBMRUZUKSB7CisJCWVyciA9IGdldF9mdW5jKGNvbnRyb2wtPmVsZW0sIGNoYW5uZWxfaWRzWzBdLCAmbGVmdCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuOworCX0KKwlpZiAoY2hhbm5lbHMgJiBSSUdIVCkgeworCQllcnIgPSBnZXRfZnVuYyhjb250cm9sLT5lbGVtLCBjaGFubmVsX2lkc1sxXSwgJnJpZ2h0KTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm47CisJfQorCWlmIChjaGFubmVscyAmIExFRlQpCisJCXNldF9mdW5jKGNvbnRyb2wtPmVsZW0sIGNoYW5uZWxfaWRzWzBdLCAhbGVmdCk7CisJaWYgKGNoYW5uZWxzICYgUklHSFQpCisJCXNldF9mdW5jKGNvbnRyb2wtPmVsZW0sIGNoYW5uZWxfaWRzWzFdLCAhcmlnaHQpOworCWRpc3BsYXlfY29udHJvbHMoKTsKK30KKworc3RhdGljIHZvaWQgdG9nZ2xlX211dGUodW5zaWduZWQgaW50IGNoYW5uZWxzKQoreworCXRvZ2dsZV9zd2l0Y2hlcyhUWVBFX1BTV0lUQ0gsIGNoYW5uZWxzKTsKK30KKworc3RhdGljIHZvaWQgdG9nZ2xlX2NhcHR1cmUodW5zaWduZWQgaW50IGNoYW5uZWxzKQoreworCXRvZ2dsZV9zd2l0Y2hlcyhUWVBFX0NTV0lUQ0gsIGNoYW5uZWxzKTsKK30KKworc3RhdGljIHZvaWQgYmFsYW5jZV92b2x1bWVzKHZvaWQpCit7CisJc3RydWN0IGNvbnRyb2wgKmNvbnRyb2w7CisJZG91YmxlIGxlZnQsIHJpZ2h0OworCWludCBlcnI7CisKKwljb250cm9sID0gZ2V0X2ZvY3VzX2NvbnRyb2woVFlQRV9QVk9MVU1FIHwgVFlQRV9DVk9MVU1FKTsKKwlpZiAoIWNvbnRyb2wgfHwgIShjb250cm9sLT5mbGFncyAmIEhBU19WT0xVTUVfMSkpCisJCXJldHVybjsKKwlpZiAoY29udHJvbC0+ZmxhZ3MgJiBUWVBFX1BWT0xVTUUpIHsKKwkJbGVmdCA9IGdldF9ub3JtYWxpemVkX3BsYXliYWNrX3ZvbHVtZShjb250cm9sLT5lbGVtLCBjb250cm9sLT52b2x1bWVfY2hhbm5lbHNbMF0pOworCQlyaWdodCA9IGdldF9ub3JtYWxpemVkX3BsYXliYWNrX3ZvbHVtZShjb250cm9sLT5lbGVtLCBjb250cm9sLT52b2x1bWVfY2hhbm5lbHNbMV0pOworCX0gZWxzZSB7CisJCWxlZnQgPSBnZXRfbm9ybWFsaXplZF9jYXB0dXJlX3ZvbHVtZShjb250cm9sLT5lbGVtLCBjb250cm9sLT52b2x1bWVfY2hhbm5lbHNbMF0pOworCQlyaWdodCA9IGdldF9ub3JtYWxpemVkX2NhcHR1cmVfdm9sdW1lKGNvbnRyb2wtPmVsZW0sIGNvbnRyb2wtPnZvbHVtZV9jaGFubmVsc1sxXSk7CisJfQorCWxlZnQgPSAobGVmdCArIHJpZ2h0KSAvIDI7CisJaWYgKGNvbnRyb2wtPmZsYWdzICYgVFlQRV9QVk9MVU1FKSB7CisJCXNldF9ub3JtYWxpemVkX3BsYXliYWNrX3ZvbHVtZShjb250cm9sLT5lbGVtLCBjb250cm9sLT52b2x1bWVfY2hhbm5lbHNbMF0sIGxlZnQsIDApOworCQlzZXRfbm9ybWFsaXplZF9wbGF5YmFja192b2x1bWUoY29udHJvbC0+ZWxlbSwgY29udHJvbC0+dm9sdW1lX2NoYW5uZWxzWzFdLCBsZWZ0LCAwKTsKKwl9IGVsc2UgeworCQlzZXRfbm9ybWFsaXplZF9jYXB0dXJlX3ZvbHVtZShjb250cm9sLT5lbGVtLCBjb250cm9sLT52b2x1bWVfY2hhbm5lbHNbMF0sIGxlZnQsIDApOworCQlzZXRfbm9ybWFsaXplZF9jYXB0dXJlX3ZvbHVtZShjb250cm9sLT5lbGVtLCBjb250cm9sLT52b2x1bWVfY2hhbm5lbHNbMV0sIGxlZnQsIDApOworCX0KKwlkaXNwbGF5X2NvbnRyb2xzKCk7Cit9CisKK3N0YXRpYyB2b2lkIG9uX2hhbmRsZV9rZXkoaW50IGtleSkKK3sKKwlzd2l0Y2ggKGtleSkgeworCWNhc2UgMjc6CisJY2FzZSBLRVlfQ0FOQ0VMOgorCWNhc2UgS0VZX0YoMTApOgorCQltaXhlcl93aWRnZXQuY2xvc2UoKTsKKwkJYnJlYWs7CisJY2FzZSBLRVlfRigxKToKKwljYXNlIEtFWV9IRUxQOgorCWNhc2UgJ0gnOgorCWNhc2UgJ2gnOgorCWNhc2UgJz8nOgorCQlzaG93X2hlbHAoKTsKKwkJYnJlYWs7CisJY2FzZSBLRVlfRigyKToKKwljYXNlICcvJzoKKwkJY3JlYXRlX3Byb2NfZmlsZXNfbGlzdCgpOworCQlicmVhazsKKwljYXNlIEtFWV9GKDMpOgorCQlzZXRfdmlld19tb2RlKFZJRVdfTU9ERV9QTEFZQkFDSyk7CisJCWJyZWFrOworCWNhc2UgS0VZX0YoNCk6CisJCXNldF92aWV3X21vZGUoVklFV19NT0RFX0NBUFRVUkUpOworCQlicmVhazsKKwljYXNlIEtFWV9GKDUpOgorCQlzZXRfdmlld19tb2RlKFZJRVdfTU9ERV9BTEwpOworCQlicmVhazsKKwljYXNlICdcdCc6CisJCXNldF92aWV3X21vZGUoKGVudW0gdmlld19tb2RlKSgodmlld19tb2RlICsgMSkgJSBWSUVXX01PREVfQ09VTlQpKTsKKwkJYnJlYWs7CisJY2FzZSBLRVlfRig2KToKKwljYXNlICdTJzoKKwljYXNlICdzJzoKKwkJY3JlYXRlX2NhcmRfc2VsZWN0X2xpc3QoKTsKKwkJYnJlYWs7CisJY2FzZSBLRVlfUkVGUkVTSDoKKwljYXNlIDEyOgorCWNhc2UgJ0wnOgorCWNhc2UgJ2wnOgorCQljbGVhcm9rKG1peGVyX3dpZGdldC53aW5kb3csIFRSVUUpOworCQlkaXNwbGF5X2NvbnRyb2xzKCk7CisJCWJyZWFrOworCWNhc2UgS0VZX0xFRlQ6CisJY2FzZSAnUCc6CisJY2FzZSAncCc6CisJCWlmIChmb2N1c19jb250cm9sX2luZGV4ID4gMCkgeworCQkJLS1mb2N1c19jb250cm9sX2luZGV4OworCQkJcmVmb2N1c19jb250cm9sKCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBLRVlfUklHSFQ6CisJY2FzZSAnTic6CisJY2FzZSAnbic6CisJCWlmIChmb2N1c19jb250cm9sX2luZGV4IDwgY29udHJvbHNfY291bnQgLSAxKSB7CisJCQkrK2ZvY3VzX2NvbnRyb2xfaW5kZXg7CisJCQlyZWZvY3VzX2NvbnRyb2woKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEtFWV9QUEFHRToKKwkJY2hhbmdlX2NvbnRyb2xfcmVsYXRpdmUoNSwgTEVGVCB8IFJJR0hUKTsKKwkJYnJlYWs7CisJY2FzZSBLRVlfTlBBR0U6CisJCWNoYW5nZV9jb250cm9sX3JlbGF0aXZlKC01LCBMRUZUIHwgUklHSFQpOworCQlicmVhazsKKyNpZiAwCisJY2FzZSBLRVlfQkVHOgorCWNhc2UgS0VZX0hPTUU6CisJCWNoYW5nZV9jb250cm9sX3RvX3BlcmNlbnQoMTAwLCBMRUZUIHwgUklHSFQpOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgS0VZX0xMOgorCWNhc2UgS0VZX0VORDoKKwkJY2hhbmdlX2NvbnRyb2xfdG9fcGVyY2VudCgwLCBMRUZUIHwgUklHSFQpOworCQlicmVhazsKKwljYXNlIEtFWV9VUDoKKwljYXNlICcrJzoKKwljYXNlICdLJzoKKwljYXNlICdrJzoKKwljYXNlICdXJzoKKwljYXNlICd3JzoKKwkJY2hhbmdlX2NvbnRyb2xfcmVsYXRpdmUoMSwgTEVGVCB8IFJJR0hUKTsKKwkJYnJlYWs7CisJY2FzZSBLRVlfRE9XTjoKKwljYXNlICctJzoKKwljYXNlICdKJzoKKwljYXNlICdqJzoKKwljYXNlICdYJzoKKwljYXNlICd4JzoKKwkJY2hhbmdlX2NvbnRyb2xfcmVsYXRpdmUoLTEsIExFRlQgfCBSSUdIVCk7CisJCWJyZWFrOworCWNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKKwljYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6CisJCWNoYW5nZV9jb250cm9sX3RvX3BlcmNlbnQoKGtleSAtICcwJykgKiAxMCwgTEVGVCB8IFJJR0hUKTsKKwkJYnJlYWs7CisJY2FzZSAnUSc6CisJY2FzZSAncSc6CisJCWNoYW5nZV9jb250cm9sX3JlbGF0aXZlKDEsIExFRlQpOworCQlicmVhazsKKwljYXNlICdZJzoKKwljYXNlICd5JzoKKwljYXNlICdaJzoKKwljYXNlICd6JzoKKwkJY2hhbmdlX2NvbnRyb2xfcmVsYXRpdmUoLTEsIExFRlQpOworCQlicmVhazsKKwljYXNlICdFJzoKKwljYXNlICdlJzoKKwkJY2hhbmdlX2NvbnRyb2xfcmVsYXRpdmUoMSwgUklHSFQpOworCQlicmVhazsKKwljYXNlICdDJzoKKwljYXNlICdjJzoKKwkJY2hhbmdlX2NvbnRyb2xfcmVsYXRpdmUoLTEsIFJJR0hUKTsKKwkJYnJlYWs7CisJY2FzZSAnTSc6CisJY2FzZSAnbSc6CisJCXRvZ2dsZV9tdXRlKExFRlQgfCBSSUdIVCk7CisJCWJyZWFrOworCWNhc2UgJ0InOgorCWNhc2UgJ2InOgorCWNhc2UgJz0nOgorCQliYWxhbmNlX3ZvbHVtZXMoKTsKKwkJYnJlYWs7CisJY2FzZSAnPCc6CisJY2FzZSAnLCc6CisJCXRvZ2dsZV9tdXRlKExFRlQpOworCQlicmVhazsKKwljYXNlICc+JzoKKwljYXNlICcuJzoKKwkJdG9nZ2xlX211dGUoUklHSFQpOworCQlicmVhazsKKwljYXNlICcgJzoKKwkJdG9nZ2xlX2NhcHR1cmUoTEVGVCB8IFJJR0hUKTsKKwkJYnJlYWs7CisJY2FzZSBLRVlfSUM6CisJY2FzZSAnOyc6CisJCXRvZ2dsZV9jYXB0dXJlKExFRlQpOworCQlicmVhazsKKwljYXNlIEtFWV9EQzoKKwljYXNlICdcJyc6CisJCXRvZ2dsZV9jYXB0dXJlKFJJR0hUKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBjcmVhdGUodm9pZCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciB0aXRsZVtdID0gIiBBbHNhTWl4ZXIgdiIgU05EX1VUSUxfVkVSU0lPTl9TVFIgIiAiOworCisJd2lkZ2V0X2luaXQoJm1peGVyX3dpZGdldCwgc2NyZWVuX2xpbmVzLCBzY3JlZW5fY29scywgMCwgMCwKKwkJICAgIGF0dHJfbWl4ZXJfZnJhbWUsIFdJREdFVF9CT1JERVIpOworCWlmIChzY3JlZW5fY29scyA+PSAoc2l6ZW9mKHRpdGxlKSAtIDEpICsgMikgeworCQl3YXR0cnNldChtaXhlcl93aWRnZXQud2luZG93LCBhdHRyX21peGVyX2FjdGl2ZSk7CisJCW12d2FkZHN0cihtaXhlcl93aWRnZXQud2luZG93LCAwLCAoc2NyZWVuX2NvbHMgLSAoc2l6ZW9mKHRpdGxlKSAtIDEpKSAvIDIsIHRpdGxlKTsKKwl9CisJaW5pdF9taXhlcl9sYXlvdXQoKTsKKwlkaXNwbGF5X2NhcmRfaW5mbygpOworCXNldF92aWV3X21vZGUodmlld19tb2RlKTsKK30KKworc3RhdGljIHZvaWQgb25fd2luZG93X3NpemVfY2hhbmdlZCh2b2lkKQoreworCWNyZWF0ZSgpOworfQorCitzdGF0aWMgdm9pZCBvbl9jbG9zZSh2b2lkKQoreworCXdpZGdldF9mcmVlKCZtaXhlcl93aWRnZXQpOworfQorCit2b2lkIG1peGVyX3NodXRkb3duKHZvaWQpCit7CisJZnJlZV9jb250cm9scygpOworCWlmIChtaXhlcikKKwkJc25kX21peGVyX2Nsb3NlKG1peGVyKTsKKwlpZiAoY3VycmVudF9zZWxlbV9pZCkKKwkJc25kX21peGVyX3NlbGVtX2lkX2ZyZWUoY3VycmVudF9zZWxlbV9pZCk7Cit9CisKK3N0cnVjdCB3aWRnZXQgbWl4ZXJfd2lkZ2V0ID0geworCS5oYW5kbGVfa2V5ID0gb25faGFuZGxlX2tleSwKKwkud2luZG93X3NpemVfY2hhbmdlZCA9IG9uX3dpbmRvd19zaXplX2NoYW5nZWQsCisJLmNsb3NlID0gb25fY2xvc2UsCit9OworCit2b2lkIGNyZWF0ZV9taXhlcl93aWRnZXQodm9pZCkKK3sKKwljcmVhdGUoKTsKK30KZGlmZiAtLWdpdCBhL2Fsc2FtaXhlci9taXhlcl93aWRnZXQuaCBiL2Fsc2FtaXhlci9taXhlcl93aWRnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTg2MjhlCi0tLSAvZGV2L251bGwKKysrIGIvYWxzYW1peGVyL21peGVyX3dpZGdldC5oCkBAIC0wLDAgKzEsMzYgQEAKKyNpZm5kZWYgTUlYRVJfV0lER0VUX0hfSU5DTFVERUQKKyNkZWZpbmUgTUlYRVJfV0lER0VUX0hfSU5DTFVERUQKKworI2luY2x1ZGUgQ1VSU0VTSU5DCisjaW5jbHVkZSA8YWxzYS9hc291bmRsaWIuaD4KKyNpbmNsdWRlICJ3aWRnZXQuaCIKKworZW51bSB2aWV3X21vZGUgeworCVZJRVdfTU9ERV9QTEFZQkFDSywKKwlWSUVXX01PREVfQ0FQVFVSRSwKKwlWSUVXX01PREVfQUxMLAorCVZJRVdfTU9ERV9DT1VOVCwKK307CisKK2V4dGVybiBzbmRfbWl4ZXJfdCAqbWl4ZXI7CitleHRlcm4gY2hhciAqbWl4ZXJfZGV2aWNlX25hbWU7CitleHRlcm4gYm9vbCB1bnBsdWdnZWQ7CisKK2V4dGVybiBzdHJ1Y3Qgd2lkZ2V0IG1peGVyX3dpZGdldDsKKworZXh0ZXJuIGVudW0gdmlld19tb2RlIHZpZXdfbW9kZTsKKworZXh0ZXJuIGludCBmb2N1c19jb250cm9sX2luZGV4OworZXh0ZXJuIHNuZF9taXhlcl9zZWxlbV9pZF90ICpjdXJyZW50X3NlbGVtX2lkOworZXh0ZXJuIHVuc2lnbmVkIGludCBjdXJyZW50X2NvbnRyb2xfZmxhZ3M7CisKK2V4dGVybiBib29sIGNvbnRyb2xzX2NoYW5nZWQ7CisKK3ZvaWQgY3JlYXRlX21peGVyX29iamVjdChzdHJ1Y3Qgc25kX21peGVyX3NlbGVtX3JlZ29wdCAqc2VsZW1fcmVnb3B0KTsKK3ZvaWQgY3JlYXRlX21peGVyX3dpZGdldCh2b2lkKTsKK3ZvaWQgbWl4ZXJfc2h1dGRvd24odm9pZCk7Cit2b2lkIGNsb3NlX21peGVyX2RldmljZSh2b2lkKTsKK2Jvb2wgc2VsZWN0X2NhcmRfYnlfbmFtZShjb25zdCBjaGFyICpkZXZpY2VfbmFtZSk7Cit2b2lkIHJlZm9jdXNfY29udHJvbCh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbHNhbWl4ZXIvcHJvY19maWxlcy5jIGIvYWxzYW1peGVyL3Byb2NfZmlsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmY1ZjIxCi0tLSAvZGV2L251bGwKKysrIGIvYWxzYW1peGVyL3Byb2NfZmlsZXMuYwpAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIHByb2NfZmlsZXMuYyAtIHNob3dzIEFMU0Egc3lzdGVtIGluZm9ybWF0aW9uIGZpbGVzCisgKiBDb3B5cmlnaHQgKGMpIENsZW1lbnMgTGFkaXNjaCA8Y2xlbWVuc0BsYWRpc2NoLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgImFjb25maWcuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxtZW51Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiZ2V0dGV4dF9jdXJzZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImRpZS5oIgorI2luY2x1ZGUgIm1lbS5oIgorI2luY2x1ZGUgImNvbG9ycy5oIgorI2luY2x1ZGUgIndpZGdldC5oIgorI2luY2x1ZGUgInRleHRib3guaCIKKyNpbmNsdWRlICJwcm9jX2ZpbGVzLmgiCisKK3N0YXRpYyBzdHJ1Y3Qgd2lkZ2V0IHByb2Nfd2lkZ2V0Oworc3RhdGljIElURU0gKml0ZW1zWzddOworc3RhdGljIHVuc2lnbmVkIGludCBpdGVtc19jb3VudDsKK3N0YXRpYyBNRU5VICptZW51OworCitzdGF0aWMgdm9pZCBvbl9tZW51X2tleShpbnQga2V5KQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCQlpbnQga2V5OworCQlpbnQgcmVxdWVzdDsKKwl9IGtleV9tYXBbXSA9IHsKKwkJeyBLRVlfRE9XTiwgUkVRX0RPV05fSVRFTSB9LAorCQl7IEtFWV9VUCwgUkVRX1VQX0lURU0gfSwKKwkJeyBLRVlfSE9NRSwgUkVRX0ZJUlNUX0lURU0gfSwKKwkJeyBLRVlfTlBBR0UsIFJFUV9TQ1JfRFBBR0UgfSwKKwkJeyBLRVlfUFBBR0UsIFJFUV9TQ1JfVVBBR0UgfSwKKwkJeyBLRVlfQkVHLCBSRVFfRklSU1RfSVRFTSB9LAorCQl7IEtFWV9FTkQsIFJFUV9MQVNUX0lURU0gfSwKKwl9OworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoa2V5X21hcCk7ICsraSkKKwkJaWYgKGtleV9tYXBbaV0ua2V5ID09IGtleSkgeworCQkJbWVudV9kcml2ZXIobWVudSwga2V5X21hcFtpXS5yZXF1ZXN0KTsKKwkJCWJyZWFrOworCQl9Cit9CisKK3N0YXRpYyB2b2lkIG9uX2hhbmRsZV9rZXkoaW50IGtleSkKK3sKKwlJVEVNICppdGVtOworCisJc3dpdGNoIChrZXkpIHsKKwljYXNlIDI3OgorCWNhc2UgS0VZX0NBTkNFTDoKKwkJcHJvY193aWRnZXQuY2xvc2UoKTsKKwkJYnJlYWs7CisJY2FzZSAxMDoKKwljYXNlIDEzOgorCWNhc2UgS0VZX0VOVEVSOgorCQlpdGVtID0gY3VycmVudF9pdGVtKG1lbnUpOworCQlpZiAoaXRlbSkKKwkJCXNob3dfdGV4dGZpbGUoaXRlbV9uYW1lKGl0ZW0pKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJb25fbWVudV9rZXkoa2V5KTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgYm9vbCBjcmVhdGUodm9pZCkKK3sKKwlpbnQgcm93cywgY29sdW1uczsKKwljb25zdCBjaGFyICp0aXRsZTsKKworCWlmIChzY3JlZW5fbGluZXMgPCAzIHx8IHNjcmVlbl9jb2xzIDwgMjApIHsKKwkJcHJvY193aWRnZXQuY2xvc2UoKTsKKwkJYmVlcCgpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCXNjYWxlX21lbnUobWVudSwgJnJvd3MsICZjb2x1bW5zKTsKKwlyb3dzICs9IDI7CisJY29sdW1ucyArPSAyOworCWlmIChyb3dzID4gc2NyZWVuX2xpbmVzKQorCQlyb3dzID0gc2NyZWVuX2xpbmVzOworCWlmIChjb2x1bW5zID4gc2NyZWVuX2NvbHMpCisJCWNvbHVtbnMgPSBzY3JlZW5fY29sczsKKworCXdpZGdldF9pbml0KCZwcm9jX3dpZGdldCwgcm93cywgY29sdW1ucywgU0NSRUVOX0NFTlRFUiwgU0NSRUVOX0NFTlRFUiwKKwkJICAgIGF0dHJfbWVudSwgV0lER0VUX0JPUkRFUiB8IFdJREdFVF9TVUJXSU5ET1cpOworCisJdGl0bGUgPSBfKCJTZWxlY3QgRmlsZSIpOworCW12d3ByaW50dyhwcm9jX3dpZGdldC53aW5kb3csIDAsIChjb2x1bW5zIC0gMiAtIGdldF9tYnNfd2lkdGgodGl0bGUpKSAvIDIsICIgJXMgIiwgdGl0bGUpOworCXNldF9tZW51X3dpbihtZW51LCBwcm9jX3dpZGdldC53aW5kb3cpOworCXNldF9tZW51X3N1YihtZW51LCBwcm9jX3dpZGdldC5zdWJ3aW5kb3cpOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZCBvbl93aW5kb3dfc2l6ZV9jaGFuZ2VkKHZvaWQpCit7CisJdW5wb3N0X21lbnUobWVudSk7CisJaWYgKCFjcmVhdGUoKSkKKwkJcmV0dXJuOworCXBvc3RfbWVudShtZW51KTsKK30KKworc3RhdGljIHZvaWQgb25fY2xvc2Uodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCXVucG9zdF9tZW51KG1lbnUpOworCWZyZWVfbWVudShtZW51KTsKKwlmb3IgKGkgPSAwOyBpIDwgaXRlbXNfY291bnQ7ICsraSkKKwkJZnJlZV9pdGVtKGl0ZW1zW2ldKTsKKwl3aWRnZXRfZnJlZSgmcHJvY193aWRnZXQpOworfQorCitzdGF0aWMgdm9pZCBhZGRfaXRlbShjb25zdCBjaGFyICpmaWxlX25hbWUpCit7CisJaWYgKGFjY2VzcyhmaWxlX25hbWUsIEZfT0spID09IDApIHsKKwkJaXRlbXNbaXRlbXNfY291bnRdID0gbmV3X2l0ZW0oZmlsZV9uYW1lLCBOVUxMKTsKKwkJaWYgKCFpdGVtc1tpdGVtc19jb3VudF0pCisJCQlmYXRhbF9lcnJvcigiY2Fubm90IGNyZWF0ZSBtZW51IGl0ZW0iKTsKKwkJKytpdGVtc19jb3VudDsKKwkJYXNzZXJ0KGl0ZW1zX2NvdW50IDwgQVJSQVlfU0laRShpdGVtcykpOworCX0KK30KKworc3RhdGljIHN0cnVjdCB3aWRnZXQgcHJvY193aWRnZXQgPSB7CisJLmhhbmRsZV9rZXkgPSBvbl9oYW5kbGVfa2V5LAorCS53aW5kb3dfc2l6ZV9jaGFuZ2VkID0gb25fd2luZG93X3NpemVfY2hhbmdlZCwKKwkuY2xvc2UgPSBvbl9jbG9zZSwKK307CisKK3ZvaWQgY3JlYXRlX3Byb2NfZmlsZXNfbGlzdCh2b2lkKQoreworCWl0ZW1zX2NvdW50ID0gMDsKKwlhZGRfaXRlbSgiL3Byb2MvYXNvdW5kL3ZlcnNpb24iKTsKKwlhZGRfaXRlbSgiL3Byb2MvYXNvdW5kL2NhcmRzIik7CisJYWRkX2l0ZW0oIi9wcm9jL2Fzb3VuZC9kZXZpY2VzIik7CisJYWRkX2l0ZW0oIi9wcm9jL2Fzb3VuZC9vc3MvZGV2aWNlcyIpOworCWFkZF9pdGVtKCIvcHJvYy9hc291bmQvdGltZXJzIik7CisJYWRkX2l0ZW0oIi9wcm9jL2Fzb3VuZC9wY20iKTsKKwlpdGVtc1tpdGVtc19jb3VudF0gPSBOVUxMOworCisJbWVudSA9IG5ld19tZW51KGl0ZW1zKTsKKwlpZiAoIW1lbnUpCisJCWZhdGFsX2Vycm9yKCJjYW5ub3QgY3JlYXRlIG1lbnUiKTsKKwlzZXRfbWVudV9mb3JlKG1lbnUsIGF0dHJfbWVudV9zZWxlY3RlZCk7CisJc2V0X21lbnVfYmFjayhtZW51LCBhdHRyX21lbnUpOworCXNldF9tZW51X21hcmsobWVudSwgTlVMTCk7CisJbWVudV9vcHRzX29mZihtZW51LCBPX1NIT1dERVNDKTsKKworCWlmICghY3JlYXRlKCkpCisJCXJldHVybjsKKworCXBvc3RfbWVudShtZW51KTsKK30KZGlmZiAtLWdpdCBhL2Fsc2FtaXhlci9wcm9jX2ZpbGVzLmggYi9hbHNhbWl4ZXIvcHJvY19maWxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NjJjNzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbHNhbWl4ZXIvcHJvY19maWxlcy5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBQUk9DX0ZJTEVTX0hfSU5DTFVERUQKKyNkZWZpbmUgUFJPQ19GSUxFU19IX0lOQ0xVREVECisKK3ZvaWQgY3JlYXRlX3Byb2NfZmlsZXNfbGlzdCh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbHNhbWl4ZXIvdGV4dGJveC5jIGIvYWxzYW1peGVyL3RleHRib3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTc5ZDNjCi0tLSAvZGV2L251bGwKKysrIGIvYWxzYW1peGVyL3RleHRib3guYwpAQCAtMCwwICsxLDM5NyBAQAorLyoKKyAqIHRleHRib3guYyAtIHNob3cgYSB0ZXh0IGJveCBmb3IgbWVzc2FnZXMsIGZpbGVzIG9yIGhlbHAKKyAqIENvcHlyaWdodCAoYykgMTk5OCwxOTk5IFRpbSBKYW5paworICogICAgICAgICAgICAgICAgICAgICAgICAgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIENvcHlyaWdodCAoYykgMjAwOSAgICAgIENsZW1lbnMgTGFkaXNjaCA8Y2xlbWVuc0BsYWRpc2NoLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgImFjb25maWcuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSBDVVJTRVNJTkMKKyNpbmNsdWRlIDxhbHNhL2Fzb3VuZGxpYi5oPgorI2luY2x1ZGUgImdldHRleHRfY3Vyc2VzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJkaWUuaCIKKyNpbmNsdWRlICJtZW0uaCIKKyNpbmNsdWRlICJjb2xvcnMuaCIKKyNpbmNsdWRlICJ3aWRnZXQuaCIKKyNpbmNsdWRlICJ0ZXh0Ym94LmgiCisKKyNkZWZpbmUgTUFYX0ZJTEVfU0laRSAxMDQ4NTc2CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV90ZXh0X2JveChjb25zdCBjaGFyICpjb25zdCAqbGluZXMsIHVuc2lnbmVkIGludCBjb3VudCwKKwkJCSAgICBjb25zdCBjaGFyICp0aXRsZSwgaW50IGF0dHJzKTsKKwordm9pZCBzaG93X2Vycm9yKGNvbnN0IGNoYXIgKm1zZywgaW50IGVycikKK3sKKwljb25zdCBjaGFyICpsaW5lc1syXTsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisKKwlsaW5lc1swXSA9IG1zZzsKKwljb3VudCA9IDE7CisJaWYgKGVycikgeworCQlsaW5lc1sxXSA9IHN0cmVycm9yKGVycik7CisJCWNvdW50ID0gMjsKKwl9CisJY3JlYXRlX3RleHRfYm94KGxpbmVzLCBjb3VudCwgXygiRXJyb3IiKSwgYXR0cl9lcnJvcm1zZyk7Cit9CisKK3ZvaWQgc2hvd19hbHNhX2Vycm9yKGNvbnN0IGNoYXIgKm1zZywgaW50IGVycikKK3sKKwljb25zdCBjaGFyICpsaW5lc1syXTsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisKKwlsaW5lc1swXSA9IG1zZzsKKwljb3VudCA9IDE7CisJaWYgKGVyciA8IDApIHsKKwkJbGluZXNbMV0gPSBzbmRfc3RyZXJyb3IoZXJyKTsKKwkJY291bnQgPSAyOworCX0KKwljcmVhdGVfdGV4dF9ib3gobGluZXMsIGNvdW50LCBfKCJFcnJvciIpLCBhdHRyX2Vycm9ybXNnKTsKK30KKworc3RhdGljIGNoYXIgKnJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlX25hbWUsIHVuc2lnbmVkIGludCAqZmlsZV9zaXplKQoreworCUZJTEUgKmY7CisJaW50IGVycjsKKwljaGFyICpidWY7CisJdW5zaWduZWQgaW50IGFsbG9jYXRlZCA9IDIwNDg7CisJdW5zaWduZWQgaW50IGJ5dGVzX3JlYWQ7CisKKwlmID0gZm9wZW4oZmlsZV9uYW1lLCAiciIpOworCWlmICghZikgeworCQllcnIgPSBlcnJubzsKKwkJYnVmID0gY2FzcHJpbnRmKF8oIkNhbm5vdCBvcGVuIGZpbGUgXCIlc1wiLiIpLCBmaWxlX25hbWUpOworCQlzaG93X2Vycm9yKGJ1ZiwgZXJyKTsKKwkJZnJlZShidWYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJKmZpbGVfc2l6ZSA9IDA7CisJYnVmID0gTlVMTDsKKwlkbyB7CisJCWFsbG9jYXRlZCAqPSAyOworCQlidWYgPSBjcmVhbGxvYyhidWYsIGFsbG9jYXRlZCk7CisJCWJ5dGVzX3JlYWQgPSBmcmVhZChidWYgKyAqZmlsZV9zaXplLCAxLCBhbGxvY2F0ZWQgLSAqZmlsZV9zaXplLCBmKTsKKwkJKmZpbGVfc2l6ZSArPSBieXRlc19yZWFkOworCX0gd2hpbGUgKCpmaWxlX3NpemUgPT0gYWxsb2NhdGVkICYmIGFsbG9jYXRlZCA8IE1BWF9GSUxFX1NJWkUpOworCWZjbG9zZShmKTsKKwlpZiAoKmZpbGVfc2l6ZSA+IDAgJiYgYnVmWypmaWxlX3NpemUgLSAxXSAhPSAnXG4nICYmICpmaWxlX3NpemUgPCBhbGxvY2F0ZWQpIHsKKwkJYnVmWypmaWxlX3NpemVdID0gJ1xuJzsKKwkJKysqZmlsZV9zaXplOworCX0KKwlyZXR1cm4gYnVmOworfQorCit2b2lkIHNob3dfdGV4dGZpbGUoY29uc3QgY2hhciAqZmlsZV9uYW1lKQoreworCWNoYXIgKmJ1ZjsKKwl1bnNpZ25lZCBpbnQgZmlsZV9zaXplOworCXVuc2lnbmVkIGludCBsaW5lX2NvdW50OworCXVuc2lnbmVkIGludCBpOworCWNvbnN0IGNoYXIgKipsaW5lczsKKwljb25zdCBjaGFyICpzdGFydF9saW5lOworCisJYnVmID0gcmVhZF9maWxlKGZpbGVfbmFtZSwgJmZpbGVfc2l6ZSk7CisJaWYgKCFidWYpCisJCXJldHVybjsKKwlsaW5lX2NvdW50ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgZmlsZV9zaXplOyArK2kpCisJCWxpbmVfY291bnQgKz0gYnVmW2ldID09ICdcbic7CisJbGluZXMgPSBjY2FsbG9jKGxpbmVfY291bnQsIHNpemVvZiAqbGluZXMpOworCWxpbmVfY291bnQgPSAwOworCXN0YXJ0X2xpbmUgPSBidWY7CisJZm9yIChpID0gMDsgaSA8IGZpbGVfc2l6ZTsgKytpKSB7CisJCWlmIChidWZbaV0gPT0gJ1xuJykgeworCQkJbGluZXNbbGluZV9jb3VudCsrXSA9IHN0YXJ0X2xpbmU7CisJCQlidWZbaV0gPSAnXDAnOworCQkJc3RhcnRfbGluZSA9ICZidWZbaSArIDFdOworCQl9CisJCWlmIChidWZbaV0gPT0gJ1x0JykKKwkJCWJ1ZltpXSA9ICcgJzsKKwl9CisJY3JlYXRlX3RleHRfYm94KGxpbmVzLCBsaW5lX2NvdW50LCBmaWxlX25hbWUsIGF0dHJfdGV4dGJveCk7CisJZnJlZShsaW5lcyk7CisJZnJlZShidWYpOworfQorCit2b2lkIHNob3dfdGV4dChjb25zdCBjaGFyICpjb25zdCAqbGluZXMsIHVuc2lnbmVkIGludCBjb3VudCwgY29uc3QgY2hhciAqdGl0bGUpCit7CisJY3JlYXRlX3RleHRfYm94KGxpbmVzLCBjb3VudCwgdGl0bGUsIGF0dHJfdGV4dGJveCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IHdpZGdldCB0ZXh0X3dpZGdldDsKK3N0YXRpYyBjaGFyICp0aXRsZTsKK3N0YXRpYyBpbnQgd2lkZ2V0X2F0dHJzOworc3RhdGljIGNoYXIgKip0ZXh0X2xpbmVzOworc3RhdGljIHVuc2lnbmVkIGludCB0ZXh0X2xpbmVzX2NvdW50Oworc3RhdGljIGludCBtYXhfbGluZV93aWR0aDsKK3N0YXRpYyBpbnQgdGV4dF9ib3hfeTsKK3N0YXRpYyBpbnQgdGV4dF9ib3hfeDsKK3N0YXRpYyBpbnQgbWF4X3Njcm9sbF95Oworc3RhdGljIGludCBtYXhfc2Nyb2xsX3g7CitzdGF0aWMgaW50IGN1cnJlbnRfdG9wOworc3RhdGljIGludCBjdXJyZW50X2xlZnQ7CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV90ZXh0X2xpbmVzKHZvaWQpCit7CisJaW50IGk7CisJaW50IHdpZHRoOworCWNvbnN0IGNoYXIgKmxpbmVfYmVnaW47CisJY29uc3QgY2hhciAqbGluZV9lbmQ7CisJaW50IGN1cl95LCBjdXJfeDsKKwlpbnQgcmVzdF9vZl9saW5lOworCisJZm9yIChpID0gMDsgaSA8IHRleHRfYm94X3k7ICsraSkgeworCQl3aWR0aCA9IGN1cnJlbnRfbGVmdDsKKwkJbGluZV9iZWdpbiA9IG1ic19hdF93aWR0aCh0ZXh0X2xpbmVzW2N1cnJlbnRfdG9wICsgaV0sICZ3aWR0aCwgMSk7CisJCXdtb3ZlKHRleHRfd2lkZ2V0LndpbmRvdywgaSArIDEsIDEpOworCQlpZiAod2lkdGggPiBjdXJyZW50X2xlZnQpCisJCQl3YWRkY2godGV4dF93aWRnZXQud2luZG93LCAnICcpOworCQlpZiAoKmxpbmVfYmVnaW4gIT0gJ1wwJykgeworCQkJd2lkdGggPSB0ZXh0X2JveF94IC0gKHdpZHRoID4gY3VycmVudF9sZWZ0KTsKKwkJCWxpbmVfZW5kID0gbWJzX2F0X3dpZHRoKGxpbmVfYmVnaW4sICZ3aWR0aCwgLTEpOworCQkJaWYgKHdpZHRoKQorCQkJCXdhZGRuc3RyKHRleHRfd2lkZ2V0LndpbmRvdywgbGluZV9iZWdpbiwKKwkJCQkJIGxpbmVfZW5kIC0gbGluZV9iZWdpbik7CisJCX0KKwkJZ2V0eXgodGV4dF93aWRnZXQud2luZG93LCBjdXJfeSwgY3VyX3gpOworCQlpZiAoY3VyX3kgPT0gaSArIDEpIHsKKwkJCXJlc3Rfb2ZfbGluZSA9IHRleHRfYm94X3ggKyAxIC0gY3VyX3g7CisJCQlpZiAocmVzdF9vZl9saW5lID4gMCkKKwkJCQl3cHJpbnR3KHRleHRfd2lkZ2V0LndpbmRvdywgIiUqcyIsIHJlc3Rfb2ZfbGluZSwgIiIpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfeV9zY3JvbGxfYmFyKHZvaWQpCit7CisJaW50IGxlbmd0aDsKKwlpbnQgYmVnaW4sIGVuZDsKKwlpbnQgaTsKKworCWlmIChtYXhfc2Nyb2xsX3kgPD0gMCB8fCB0ZXh0X2xpbmVzX2NvdW50ID09IDApCisJCXJldHVybjsKKwlsZW5ndGggPSB0ZXh0X2JveF95ICogdGV4dF9ib3hfeSAvIHRleHRfbGluZXNfY291bnQ7CisJaWYgKGxlbmd0aCA+PSB0ZXh0X2JveF95KQorCQlyZXR1cm47CisJYmVnaW4gPSBjdXJyZW50X3RvcCAqICh0ZXh0X2JveF95IC0gbGVuZ3RoKSAvIG1heF9zY3JvbGxfeTsKKwllbmQgPSBiZWdpbiArIGxlbmd0aDsKKwlmb3IgKGkgPSAwOyBpIDwgdGV4dF9ib3hfeTsgKytpKQorCQltdndhZGRjaCh0ZXh0X3dpZGdldC53aW5kb3csIGkgKyAxLCB0ZXh0X2JveF94ICsgMSwKKwkJCSBpID49IGJlZ2luICYmIGkgPCBlbmQgPyBBQ1NfQk9BUkQgOiAnICcpOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfeF9zY3JvbGxfYmFyKHZvaWQpCit7CisJaW50IGxlbmd0aDsKKwlpbnQgYmVnaW4sIGVuZDsKKwlpbnQgaTsKKworCWlmIChtYXhfc2Nyb2xsX3ggPD0gMCB8fCBtYXhfbGluZV93aWR0aCA8PSAwKQorCQlyZXR1cm47CisJbGVuZ3RoID0gdGV4dF9ib3hfeCAqIHRleHRfYm94X3ggLyBtYXhfbGluZV93aWR0aDsKKwlpZiAobGVuZ3RoID49IHRleHRfYm94X3gpCisJCXJldHVybjsKKwliZWdpbiA9IGN1cnJlbnRfbGVmdCAqICh0ZXh0X2JveF94IC0gbGVuZ3RoKSAvIG1heF9zY3JvbGxfeDsKKwllbmQgPSBiZWdpbiArIGxlbmd0aDsKKwl3bW92ZSh0ZXh0X3dpZGdldC53aW5kb3csIHRleHRfYm94X3kgKyAxLCAxKTsKKwlmb3IgKGkgPSAwOyBpIDwgdGV4dF9ib3hfeDsgKytpKQorCQl3YWRkY2godGV4dF93aWRnZXQud2luZG93LCBpID49IGJlZ2luICYmIGkgPCBlbmQgPyBBQ1NfQk9BUkQgOiAnICcpOworfQorCitzdGF0aWMgdm9pZCBtb3ZlX3goaW50IGRlbHRhKQoreworCWludCBsZWZ0OworCisJbGVmdCA9IGN1cnJlbnRfbGVmdCArIGRlbHRhOworCWlmIChsZWZ0IDwgMCkKKwkJbGVmdCA9IDA7CisJZWxzZSBpZiAobGVmdCA+IG1heF9zY3JvbGxfeCkKKwkJbGVmdCA9IG1heF9zY3JvbGxfeDsKKwlpZiAobGVmdCAhPSBjdXJyZW50X2xlZnQpIHsKKwkJY3VycmVudF9sZWZ0ID0gbGVmdDsKKwkJdXBkYXRlX3RleHRfbGluZXMoKTsKKwkJdXBkYXRlX3hfc2Nyb2xsX2JhcigpOworCX0KK30KKworc3RhdGljIHZvaWQgbW92ZV95KGludCBkZWx0YSkKK3sKKwlpbnQgdG9wOworCisJdG9wID0gY3VycmVudF90b3AgKyBkZWx0YTsKKwlpZiAodG9wIDwgMCkKKwkJdG9wID0gMDsKKwllbHNlIGlmICh0b3AgPiBtYXhfc2Nyb2xsX3kpCisJCXRvcCA9IG1heF9zY3JvbGxfeTsKKwlpZiAodG9wICE9IGN1cnJlbnRfdG9wKSB7CisJCWN1cnJlbnRfdG9wID0gdG9wOworCQl1cGRhdGVfdGV4dF9saW5lcygpOworCQl1cGRhdGVfeV9zY3JvbGxfYmFyKCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBvbl9oYW5kbGVfa2V5KGludCBrZXkpCit7CisJc3dpdGNoIChrZXkpIHsKKwljYXNlIDEwOgorCWNhc2UgMTM6CisJY2FzZSAyNzoKKwljYXNlIEtFWV9DQU5DRUw6CisJY2FzZSBLRVlfRU5URVI6CisJY2FzZSBLRVlfQ0xPU0U6CisJY2FzZSBLRVlfRVhJVDoKKwkJdGV4dF93aWRnZXQuY2xvc2UoKTsKKwkJYnJlYWs7CisJY2FzZSBLRVlfRE9XTjoKKwljYXNlIEtFWV9TRjoKKwljYXNlICdKJzoKKwljYXNlICdqJzoKKwljYXNlICdYJzoKKwljYXNlICd4JzoKKwkJbW92ZV95KDEpOworCQlicmVhazsKKwljYXNlIEtFWV9VUDoKKwljYXNlIEtFWV9TUjoKKwljYXNlICdLJzoKKwljYXNlICdrJzoKKwljYXNlICdXJzoKKwljYXNlICd3JzoKKwkJbW92ZV95KC0xKTsKKwkJYnJlYWs7CisJY2FzZSBLRVlfTEVGVDoKKwljYXNlICdIJzoKKwljYXNlICdoJzoKKwljYXNlICdQJzoKKwljYXNlICdwJzoKKwkJbW92ZV94KC0xKTsKKwkJYnJlYWs7CisJY2FzZSBLRVlfUklHSFQ6CisJY2FzZSAnTCc6CisJY2FzZSAnbCc6CisJY2FzZSAnTic6CisJY2FzZSAnbic6CisJCW1vdmVfeCgxKTsKKwkJYnJlYWs7CisJY2FzZSBLRVlfTlBBR0U6CisJY2FzZSAnICc6CisJCW1vdmVfeSh0ZXh0X2JveF95KTsKKwkJYnJlYWs7CisJY2FzZSBLRVlfUFBBR0U6CisJY2FzZSBLRVlfQkFDS1NQQUNFOgorCWNhc2UgJ0InOgorCWNhc2UgJ2InOgorCQltb3ZlX3koLXRleHRfYm94X3kpOworCQlicmVhazsKKwljYXNlIEtFWV9IT01FOgorCWNhc2UgS0VZX0JFRzoKKwkJbW92ZV94KC1tYXhfc2Nyb2xsX3gpOworCQlicmVhazsKKwljYXNlIEtFWV9MTDoKKwljYXNlIEtFWV9FTkQ6CisJCW1vdmVfeChtYXhfc2Nyb2xsX3gpOworCQlicmVhazsKKwljYXNlICdcdCc6CisJCW1vdmVfeCg4KTsKKwkJYnJlYWs7CisJY2FzZSBLRVlfQlRBQjoKKwkJbW92ZV94KC04KTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgYm9vbCBjcmVhdGUodm9pZCkKK3sKKwlpbnQgbGVuLCB3aWR0aDsKKworCWlmIChzY3JlZW5fbGluZXMgPCAzIHx8IHNjcmVlbl9jb2xzIDwgOCkgeworCQl0ZXh0X3dpZGdldC5jbG9zZSgpOworCQliZWVwKCk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwl3aWR0aCA9IG1heF9saW5lX3dpZHRoOworCWxlbiA9IGdldF9tYnNfd2lkdGgodGl0bGUpICsgMjsKKwlpZiAod2lkdGggPCBsZW4pCisJCXdpZHRoID0gbGVuOworCisJdGV4dF9ib3hfeSA9IHRleHRfbGluZXNfY291bnQ7CisJaWYgKHRleHRfYm94X3kgPiBzY3JlZW5fbGluZXMgLSAyKQorCQl0ZXh0X2JveF95ID0gc2NyZWVuX2xpbmVzIC0gMjsKKwltYXhfc2Nyb2xsX3kgPSB0ZXh0X2xpbmVzX2NvdW50IC0gdGV4dF9ib3hfeTsKKwl0ZXh0X2JveF94ID0gd2lkdGg7CisJaWYgKHRleHRfYm94X3ggPiBzY3JlZW5fY29scyAtIDIpCisJCXRleHRfYm94X3ggPSBzY3JlZW5fY29scyAtIDI7CisJbWF4X3Njcm9sbF94ID0gbWF4X2xpbmVfd2lkdGggLSB0ZXh0X2JveF94OworCisJd2lkZ2V0X2luaXQoJnRleHRfd2lkZ2V0LCB0ZXh0X2JveF95ICsgMiwgdGV4dF9ib3hfeCArIDIsCisJCSAgICBTQ1JFRU5fQ0VOVEVSLCBTQ1JFRU5fQ0VOVEVSLCB3aWRnZXRfYXR0cnMsIFdJREdFVF9CT1JERVIpOworCW12d3ByaW50dyh0ZXh0X3dpZGdldC53aW5kb3csIDAsICh0ZXh0X2JveF94ICsgMiAtIGdldF9tYnNfd2lkdGgodGl0bGUpIC0gMikgLyAyLCAiICVzICIsIHRpdGxlKTsKKworCWlmIChjdXJyZW50X3RvcCA+IG1heF9zY3JvbGxfeSkKKwkJY3VycmVudF90b3AgPSBtYXhfc2Nyb2xsX3k7CisJaWYgKGN1cnJlbnRfbGVmdCA+IG1heF9zY3JvbGxfeCkKKwkJY3VycmVudF9sZWZ0ID0gbWF4X3Njcm9sbF94OworCXVwZGF0ZV90ZXh0X2xpbmVzKCk7CisJdXBkYXRlX3lfc2Nyb2xsX2JhcigpOworCXVwZGF0ZV94X3Njcm9sbF9iYXIoKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQgb25fd2luZG93X3NpemVfY2hhbmdlZCh2b2lkKQoreworCWNyZWF0ZSgpOworfQorCitzdGF0aWMgdm9pZCBvbl9jbG9zZSh2b2lkKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IHRleHRfbGluZXNfY291bnQ7ICsraSkKKwkJZnJlZSh0ZXh0X2xpbmVzW2ldKTsKKwlmcmVlKHRleHRfbGluZXMpOworCXdpZGdldF9mcmVlKCZ0ZXh0X3dpZGdldCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgd2lkZ2V0IHRleHRfd2lkZ2V0ID0geworCS5oYW5kbGVfa2V5ID0gb25faGFuZGxlX2tleSwKKwkud2luZG93X3NpemVfY2hhbmdlZCA9IG9uX3dpbmRvd19zaXplX2NoYW5nZWQsCisJLmNsb3NlID0gb25fY2xvc2UsCit9OworCitzdGF0aWMgdm9pZCBjcmVhdGVfdGV4dF9ib3goY29uc3QgY2hhciAqY29uc3QgKmxpbmVzLCB1bnNpZ25lZCBpbnQgY291bnQsCisJCQkgICAgY29uc3QgY2hhciAqdGl0bGVfLCBpbnQgYXR0cnMpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwl0ZXh0X2xpbmVzID0gY2NhbGxvYyhjb3VudCwgc2l6ZW9mICp0ZXh0X2xpbmVzKTsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKwkJdGV4dF9saW5lc1tpXSA9IGNzdHJkdXAobGluZXNbaV0pOworCXRleHRfbGluZXNfY291bnQgPSBjb3VudDsKKwltYXhfbGluZV93aWR0aCA9IGdldF9tYXhfbWJzX3dpZHRoKGxpbmVzLCBjb3VudCk7CisJdGl0bGUgPSBjc3RyZHVwKHRpdGxlXyk7CisJd2lkZ2V0X2F0dHJzID0gYXR0cnM7CisKKwljdXJyZW50X3RvcCA9IDA7CisJY3VycmVudF9sZWZ0ID0gMDsKKworCWNyZWF0ZSgpOworfQpkaWZmIC0tZ2l0IGEvYWxzYW1peGVyL3RleHRib3guaCBiL2Fsc2FtaXhlci90ZXh0Ym94LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RjMjkwYgotLS0gL2Rldi9udWxsCisrKyBiL2Fsc2FtaXhlci90ZXh0Ym94LmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBURVhUQk9YX0hfSU5DTFVERUQKKyNkZWZpbmUgVEVYVEJPWF9IX0lOQ0xVREVECisKK3ZvaWQgc2hvd19lcnJvcihjb25zdCBjaGFyICptc2csIGludCBlcnIpOwordm9pZCBzaG93X2Fsc2FfZXJyb3IoY29uc3QgY2hhciAqbXNnLCBpbnQgZXJyKTsKK3ZvaWQgc2hvd190ZXh0KGNvbnN0IGNoYXIgKmNvbnN0ICp0ZXh0X2xpbmVzLCB1bnNpZ25lZCBpbnQgY291bnQsCisJICAgICAgIGNvbnN0IGNoYXIgKnRpdGxlKTsKK3ZvaWQgc2hvd190ZXh0ZmlsZShjb25zdCBjaGFyICpmaWxlX25hbWUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2Fsc2FtaXhlci91dGlscy5jIGIvYWxzYW1peGVyL3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYwMmJlZgotLS0gL2Rldi9udWxsCisrKyBiL2Fsc2FtaXhlci91dGlscy5jCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogdXRpbHMuYyAtIG11bHRpYnl0ZS1zdHJpbmcgaGVscGVycworICogQ29weXJpZ2h0IChjKSBDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNkZWZpbmUgX1hPUEVOX1NPVVJDRQorI2luY2x1ZGUgImFjb25maWcuaCIKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx3Y2hhci5oPgorI2luY2x1ZGUgInV0aWxzLmgiCisKKy8qCisgKiBtYnNfYXRfd2lkdGggLSBjb21wdXRlIHNjcmVlbiBwb3NpdGlvbiBpbiBhIHN0cmluZworICoKKyAqIEZvciBkaXNwbGF5aW5nIHN0cmluZ3Mgb24gdGhlIHNjcmVlbiwgd2UgaGF2ZSB0byBrbm93IGhvdyBtYW55IGNoYXJhY3RlcgorICogY2VsbHMgYXJlIG9jY3VwaWVkLiAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBwb3NpdGlvbiBpbiBhIG11bHRpYnl0ZQorICogc3RyaW5nIHRoYXQgaXMgYXQgYSBkZXNpcmVkIHBvc2l0aW9uLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBzOiAgICAgdGhlIHN0cmluZworICogd2lkdGg6IG9uIGlucHV0LCB0aGUgZGVzaXJlZCBudW1iZXIgb2YgY2hhcmFjdGVyIGNlbGxzOyBvbiBvdXRwdXQsIHRoZSBhY3R1YWwKKyAqICAgICAgICBwb3NpdGlvbiwgaW4gY2hhcmFjdGVyIGNlbGxzLCBvZiB0aGUgcmV0dXJuIHZhbHVlCisgKiBkaXI6ICAgLTEgb3IgMTsgaW4gd2hpY2ggZGlyZWN0aW9uIHRvIHJvdW5kIGlmIGEgbXVsdGktY29sdW1uIGNoYXJhY3RlciBnb2VzCisgKiAgICAgICAgb3ZlciB0aGUgZGVzaXJlZCB3aWR0aAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIFBvaW50ZXIgdG8gdGhlIHBsYWNlIGluIHRoZSBzdHJpbmcgdGhhdCBpcyBhcyBuZWFyIHRoZSBkZXNpcmVkIHdpZHRoIGFzCisgKiBwb3NzaWJsZS4gIElmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0LCB0aGUgcmV0dXJuIHZhbHVlIHBvaW50cyB0byB0aGUKKyAqIHRlcm1pbmF0aW5nIHplcm8uICBJZiB0aGUgbGFzdCBjaGFyYWN0ZXIgaXMgYSBtdWx0aS1jb2x1bW4gY2hhcmFjdGVyIHRoYXQKKyAqIGdvZXMgb3ZlciB0aGUgZGVzaXJlZCB3aWR0aCwgdGhlIHJldHVybiB2YWx1ZSBtYXkgYmUgb25lIGNoYXJhY3RlciBjZWxsCisgKiBlYXJsaWVyIG9yIGxhdGVyIHRoYW4gZGVzaXJlZCwgZGVwZW5kaW5nIG9uIHRoZSBkaXIgcGFyYW1ldGVyLgorICogSW4gYW55IGNhc2UsIHRoZSByZXR1cm4gdmFsdWUgcG9pbnRzIGFmdGVyIGFueSB6ZXJvLXdpZHRoIGNoYXJhY3RlcnMgdGhhdAorICogZm9sbG93IHRoZSBsYXN0IGNoYXJhY3Rlci4KKyAqLworY29uc3QgY2hhciAqbWJzX2F0X3dpZHRoKGNvbnN0IGNoYXIgKnMsIGludCAqd2lkdGgsIGludCBkaXIpCit7CisJc2l6ZV90IGxlbjsKKwl3Y2hhcl90IHdjOworCWludCBieXRlczsKKwlpbnQgd2lkdGhfc29fZmFyLCB3OworCisJaWYgKCp3aWR0aCA8PSAwKQorCQlyZXR1cm4gczsKKwltYnRvd2MoTlVMTCwgTlVMTCwgMCk7IC8qIHJlc2V0IHNoaWZ0IHN0YXRlICovCisJbGVuID0gc3RybGVuKHMpOworCXdpZHRoX3NvX2ZhciA9IDA7CisJd2hpbGUgKGxlbiAmJiAoYnl0ZXMgPSBtYnRvd2MoJndjLCBzLCBsZW4pKSA+IDApIHsKKwkJdyA9IHdjd2lkdGgod2MpOworCQlpZiAod2lkdGhfc29fZmFyICsgdyA+ICp3aWR0aCAmJiBkaXIgPCAwKQorCQkJYnJlYWs7CisJCWlmICh3ID49IDApCisJCQl3aWR0aF9zb19mYXIgKz0gdzsKKwkJcyArPSBieXRlczsKKwkJbGVuIC09IGJ5dGVzOworCQlpZiAod2lkdGhfc29fZmFyID49ICp3aWR0aCkgeworCQkJd2hpbGUgKGxlbiAmJiAoYnl0ZXMgPSBtYnRvd2MoJndjLCBzLCBsZW4pKSA+IDApIHsKKwkJCQl3ID0gd2N3aWR0aCh3Yyk7CisJCQkJaWYgKHcgIT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJcyArPSBieXRlczsKKwkJCQlsZW4gLT0gYnl0ZXM7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKwkqd2lkdGggPSB3aWR0aF9zb19mYXI7CisJcmV0dXJuIHM7Cit9CisKKy8qCisgKiBnZXRfbWJzX3dpZHRoIC0gY29tcHV0ZSBzY3JlZW4gd2lkdGggb2YgYSBzdHJpbmcKKyAqLwordW5zaWduZWQgaW50IGdldF9tYnNfd2lkdGgoY29uc3QgY2hhciAqcykKK3sKKwlpbnQgd2lkdGg7CisKKwl3aWR0aCA9IElOVF9NQVg7CisJbWJzX2F0X3dpZHRoKHMsICZ3aWR0aCwgMSk7CisJcmV0dXJuIHdpZHRoOworfQorCisvKgorICogZ2V0X21heF9tYnNfd2lkdGggLSBnZXQgd2lkdGggb2YgbG9uZ2VzdCBzdHJpbmcgaW4gYW4gYXJyYXkKKyAqLwordW5zaWduZWQgaW50IGdldF9tYXhfbWJzX3dpZHRoKGNvbnN0IGNoYXIgKmNvbnN0ICpzLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJdW5zaWduZWQgaW50IG1heF93aWR0aCwgaSwgbGVuOworCisJbWF4X3dpZHRoID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworCQlsZW4gPSBnZXRfbWJzX3dpZHRoKHNbaV0pOworCQlpZiAobGVuID4gbWF4X3dpZHRoKQorCQkJbWF4X3dpZHRoID0gbGVuOworCX0KKwlyZXR1cm4gbWF4X3dpZHRoOworfQpkaWZmIC0tZ2l0IGEvYWxzYW1peGVyL3V0aWxzLmggYi9hbHNhbWl4ZXIvdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGE1MmRkCi0tLSAvZGV2L251bGwKKysrIGIvYWxzYW1peGVyL3V0aWxzLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBVVElMU19IX0lOQ0xVREVECisjZGVmaW5lIFVUSUxTX0hfSU5DTFVERUQKKworI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YgKihhKSkKKwordW5zaWduZWQgaW50IGdldF9tYnNfd2lkdGgoY29uc3QgY2hhciAqcyk7Cit1bnNpZ25lZCBpbnQgZ2V0X21heF9tYnNfd2lkdGgoY29uc3QgY2hhciAqY29uc3QgKnMsIHVuc2lnbmVkIGludCBjb3VudCk7Citjb25zdCBjaGFyICptYnNfYXRfd2lkdGgoY29uc3QgY2hhciAqcywgaW50ICp3aWR0aCwgaW50IGRpcik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYWxzYW1peGVyL3ZvbHVtZV9tYXBwaW5nLmMgYi9hbHNhbWl4ZXIvdm9sdW1lX21hcHBpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzBkN2M0Ci0tLSAvZGV2L251bGwKKysrIGIvYWxzYW1peGVyL3ZvbHVtZV9tYXBwaW5nLmMKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgQ2xlbWVucyBMYWRpc2NoIDxjbGVtZW5zQGxhZGlzY2guZGU+CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIG1hcCB0aGUgdmFsdWUgcmFuZ2VzIG9mIEFMU0EgbWl4ZXIgY29udHJvbHMgb250bworICogdGhlIGludGVydmFsIDAuLjEuCisgKgorICogVGhlIG1hcHBpbmcgaXMgZGVzaWduZWQgc28gdGhhdCB0aGUgcG9zaXRpb24gaW4gdGhlIGludGVydmFsIGlzIHByb3BvcnRpb25hbAorICogdG8gdGhlIHZvbHVtZSBhcyBhIGh1bWFuIGVhciB3b3VsZCBwZXJjZWl2ZSBpdCAoaS5lLiwgdGhlIHBvc2l0aW9uIGlzIHRoZQorICogY3ViaWMgcm9vdCBvZiB0aGUgbGluZWFyIHNhbXBsZSBtdWx0aXBsaWNhdGlvbiBmYWN0b3IpLiAgRm9yIGNvbnRyb2xzIHdpdGgKKyAqIGEgc21hbGwgcmFuZ2UgKDI0IGRCIG9yIGxlc3MpLCB0aGUgbWFwcGluZyBpcyBsaW5lYXIgaW4gdGhlIGRCIHZhbHVlcyBzbworICogdGhhdCBlYWNoIHN0ZXAgaGFzIHRoZSBzYW1lIHNpemUgdmlzdWFsbHkuICBPbmx5IGZvciBjb250cm9scyB3aXRob3V0IGRCCisgKiBpbmZvcm1hdGlvbiwgYSBsaW5lYXIgbWFwcGluZyBvZiB0aGUgaGFyZHdhcmUgdm9sdW1lIHJlZ2lzdGVyIHZhbHVlcyBpcyB1c2VkCisgKiAodGhpcyBpcyB0aGUgc2FtZSBhbGdvcml0aG0gYXMgdXNlZCBpbiB0aGUgb2xkIGFsc2FtaXhlcikuCisgKgorICogV2hlbiBzZXR0aW5nIHRoZSB2b2x1bWUsICdkaXInIGlzIHRoZSByb3VuZGluZyBkaXJlY3Rpb246CisgKiAtMS8wLzEgPSBkb3duL25lYXJlc3QvdXAuCisgKi8KKworI2RlZmluZSBfSVNPQzk5X1NPVVJDRSAvKiBscmludCgpICovCisjZGVmaW5lIF9HTlVfU09VUkNFIC8qIGV4cDEwKCkgKi8KKyNpbmNsdWRlICJhY29uZmlnLmgiCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlICJ2b2x1bWVfbWFwcGluZy5oIgorCisjaWZkZWYgX19VQ0xJQkNfXworLyogMTBeeCA9IDEwXihsb2cgZV54KSA9IChlXngpXmxvZzEwID0gZV4oeCAqIGxvZyAxMCkgKi8KKyNkZWZpbmUgZXhwMTAoeCkgKGV4cCgoeCkgKiBsb2coMTApKSkKKyNlbmRpZiAvKiBfX1VDTElCQ19fICovCisKKyNkZWZpbmUgTUFYX0xJTkVBUl9EQl9TQ0FMRQkyNAorCitzdGF0aWMgaW5saW5lIGJvb2wgdXNlX2xpbmVhcl9kQl9zY2FsZShsb25nIGRCbWluLCBsb25nIGRCbWF4KQoreworCXJldHVybiBkQm1heCAtIGRCbWluIDw9IE1BWF9MSU5FQVJfREJfU0NBTEUgKiAxMDA7Cit9CisKK3N0YXRpYyBsb25nIGxyaW50X2Rpcihkb3VibGUgeCwgaW50IGRpcikKK3sKKwlpZiAoZGlyID4gMCkKKwkJcmV0dXJuIGxyaW50KGNlaWwoeCkpOworCWVsc2UgaWYgKGRpciA8IDApCisJCXJldHVybiBscmludChmbG9vcih4KSk7CisJZWxzZQorCQlyZXR1cm4gbHJpbnQoeCk7Cit9CisKK2VudW0gY3RsX2RpciB7IFBMQVlCQUNLLCBDQVBUVVJFIH07CisKK3N0YXRpYyBpbnQgKCogY29uc3QgZ2V0X2RCX3JhbmdlWzJdKShzbmRfbWl4ZXJfZWxlbV90ICosIGxvbmcgKiwgbG9uZyAqKSA9IHsKKwlzbmRfbWl4ZXJfc2VsZW1fZ2V0X3BsYXliYWNrX2RCX3JhbmdlLAorCXNuZF9taXhlcl9zZWxlbV9nZXRfY2FwdHVyZV9kQl9yYW5nZSwKK307CitzdGF0aWMgaW50ICgqIGNvbnN0IGdldF9yYXdfcmFuZ2VbMl0pKHNuZF9taXhlcl9lbGVtX3QgKiwgbG9uZyAqLCBsb25nICopID0geworCXNuZF9taXhlcl9zZWxlbV9nZXRfcGxheWJhY2tfdm9sdW1lX3JhbmdlLAorCXNuZF9taXhlcl9zZWxlbV9nZXRfY2FwdHVyZV92b2x1bWVfcmFuZ2UsCit9Oworc3RhdGljIGludCAoKiBjb25zdCBnZXRfZEJbMl0pKHNuZF9taXhlcl9lbGVtX3QgKiwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCwgbG9uZyAqKSA9IHsKKwlzbmRfbWl4ZXJfc2VsZW1fZ2V0X3BsYXliYWNrX2RCLAorCXNuZF9taXhlcl9zZWxlbV9nZXRfY2FwdHVyZV9kQiwKK307CitzdGF0aWMgaW50ICgqIGNvbnN0IGdldF9yYXdbMl0pKHNuZF9taXhlcl9lbGVtX3QgKiwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCwgbG9uZyAqKSA9IHsKKwlzbmRfbWl4ZXJfc2VsZW1fZ2V0X3BsYXliYWNrX3ZvbHVtZSwKKwlzbmRfbWl4ZXJfc2VsZW1fZ2V0X2NhcHR1cmVfdm9sdW1lLAorfTsKK3N0YXRpYyBpbnQgKCogY29uc3Qgc2V0X2RCWzJdKShzbmRfbWl4ZXJfZWxlbV90ICosIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QsIGxvbmcsIGludCkgPSB7CisJc25kX21peGVyX3NlbGVtX3NldF9wbGF5YmFja19kQiwKKwlzbmRfbWl4ZXJfc2VsZW1fc2V0X2NhcHR1cmVfZEIsCit9Oworc3RhdGljIGludCAoKiBjb25zdCBzZXRfcmF3WzJdKShzbmRfbWl4ZXJfZWxlbV90ICosIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QsIGxvbmcpID0geworCXNuZF9taXhlcl9zZWxlbV9zZXRfcGxheWJhY2tfdm9sdW1lLAorCXNuZF9taXhlcl9zZWxlbV9zZXRfY2FwdHVyZV92b2x1bWUsCit9OworCitzdGF0aWMgZG91YmxlIGdldF9ub3JtYWxpemVkX3ZvbHVtZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLAorCQkJCSAgICBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsCisJCQkJICAgIGVudW0gY3RsX2RpciBjdGxfZGlyKQoreworCWxvbmcgbWluLCBtYXgsIHZhbHVlOworCWRvdWJsZSBub3JtYWxpemVkLCBtaW5fbm9ybTsKKwlpbnQgZXJyOworCisJZXJyID0gZ2V0X2RCX3JhbmdlW2N0bF9kaXJdKGVsZW0sICZtaW4sICZtYXgpOworCWlmIChlcnIgPCAwIHx8IG1pbiA+PSBtYXgpIHsKKwkJZXJyID0gZ2V0X3Jhd19yYW5nZVtjdGxfZGlyXShlbGVtLCAmbWluLCAmbWF4KTsKKwkJaWYgKGVyciA8IDAgfHwgbWluID09IG1heCkKKwkJCXJldHVybiAwOworCisJCWVyciA9IGdldF9yYXdbY3RsX2Rpcl0oZWxlbSwgY2hhbm5lbCwgJnZhbHVlKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gMDsKKworCQlyZXR1cm4gKHZhbHVlIC0gbWluKSAvIChkb3VibGUpKG1heCAtIG1pbik7CisJfQorCisJZXJyID0gZ2V0X2RCW2N0bF9kaXJdKGVsZW0sIGNoYW5uZWwsICZ2YWx1ZSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiAwOworCisJaWYgKHVzZV9saW5lYXJfZEJfc2NhbGUobWluLCBtYXgpKQorCQlyZXR1cm4gKHZhbHVlIC0gbWluKSAvIChkb3VibGUpKG1heCAtIG1pbik7CisKKwlub3JtYWxpemVkID0gZXhwMTAoKHZhbHVlIC0gbWF4KSAvIDYwMDAuMCk7CisJaWYgKG1pbiAhPSBTTkRfQ1RMX1RMVl9EQl9HQUlOX01VVEUpIHsKKwkJbWluX25vcm0gPSBleHAxMCgobWluIC0gbWF4KSAvIDYwMDAuMCk7CisJCW5vcm1hbGl6ZWQgPSAobm9ybWFsaXplZCAtIG1pbl9ub3JtKSAvICgxIC0gbWluX25vcm0pOworCX0KKworCXJldHVybiBub3JtYWxpemVkOworfQorCitzdGF0aWMgaW50IHNldF9ub3JtYWxpemVkX3ZvbHVtZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLAorCQkJCSBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsCisJCQkJIGRvdWJsZSB2b2x1bWUsCisJCQkJIGludCBkaXIsCisJCQkJIGVudW0gY3RsX2RpciBjdGxfZGlyKQoreworCWxvbmcgbWluLCBtYXgsIHZhbHVlOworCWRvdWJsZSBtaW5fbm9ybTsKKwlpbnQgZXJyOworCisJZXJyID0gZ2V0X2RCX3JhbmdlW2N0bF9kaXJdKGVsZW0sICZtaW4sICZtYXgpOworCWlmIChlcnIgPCAwIHx8IG1pbiA+PSBtYXgpIHsKKwkJZXJyID0gZ2V0X3Jhd19yYW5nZVtjdGxfZGlyXShlbGVtLCAmbWluLCAmbWF4KTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCisJCXZhbHVlID0gbHJpbnRfZGlyKHZvbHVtZSAqIChtYXggLSBtaW4pLCBkaXIpICsgbWluOworCQlyZXR1cm4gc2V0X3Jhd1tjdGxfZGlyXShlbGVtLCBjaGFubmVsLCB2YWx1ZSk7CisJfQorCisJaWYgKHVzZV9saW5lYXJfZEJfc2NhbGUobWluLCBtYXgpKSB7CisJCXZhbHVlID0gbHJpbnRfZGlyKHZvbHVtZSAqIChtYXggLSBtaW4pLCBkaXIpICsgbWluOworCQlyZXR1cm4gc2V0X2RCW2N0bF9kaXJdKGVsZW0sIGNoYW5uZWwsIHZhbHVlLCBkaXIpOworCX0KKworCWlmIChtaW4gIT0gU05EX0NUTF9UTFZfREJfR0FJTl9NVVRFKSB7CisJCW1pbl9ub3JtID0gZXhwMTAoKG1pbiAtIG1heCkgLyA2MDAwLjApOworCQl2b2x1bWUgPSB2b2x1bWUgKiAoMSAtIG1pbl9ub3JtKSArIG1pbl9ub3JtOworCX0KKwl2YWx1ZSA9IGxyaW50X2Rpcig2MDAwLjAgKiBsb2cxMCh2b2x1bWUpLCBkaXIpICsgbWF4OworCXJldHVybiBzZXRfZEJbY3RsX2Rpcl0oZWxlbSwgY2hhbm5lbCwgdmFsdWUsIGRpcik7Cit9CisKK2RvdWJsZSBnZXRfbm9ybWFsaXplZF9wbGF5YmFja192b2x1bWUoc25kX21peGVyX2VsZW1fdCAqZWxlbSwKKwkJCQkgICAgICBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwpCit7CisJcmV0dXJuIGdldF9ub3JtYWxpemVkX3ZvbHVtZShlbGVtLCBjaGFubmVsLCBQTEFZQkFDSyk7Cit9CisKK2RvdWJsZSBnZXRfbm9ybWFsaXplZF9jYXB0dXJlX3ZvbHVtZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLAorCQkJCSAgICAgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsKQoreworCXJldHVybiBnZXRfbm9ybWFsaXplZF92b2x1bWUoZWxlbSwgY2hhbm5lbCwgQ0FQVFVSRSk7Cit9CisKK2ludCBzZXRfbm9ybWFsaXplZF9wbGF5YmFja192b2x1bWUoc25kX21peGVyX2VsZW1fdCAqZWxlbSwKKwkJCQkgICBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsCisJCQkJICAgZG91YmxlIHZvbHVtZSwKKwkJCQkgICBpbnQgZGlyKQoreworCXJldHVybiBzZXRfbm9ybWFsaXplZF92b2x1bWUoZWxlbSwgY2hhbm5lbCwgdm9sdW1lLCBkaXIsIFBMQVlCQUNLKTsKK30KKworaW50IHNldF9ub3JtYWxpemVkX2NhcHR1cmVfdm9sdW1lKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sCisJCQkJICBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsCisJCQkJICBkb3VibGUgdm9sdW1lLAorCQkJCSAgaW50IGRpcikKK3sKKwlyZXR1cm4gc2V0X25vcm1hbGl6ZWRfdm9sdW1lKGVsZW0sIGNoYW5uZWwsIHZvbHVtZSwgZGlyLCBDQVBUVVJFKTsKK30KZGlmZiAtLWdpdCBhL2Fsc2FtaXhlci92b2x1bWVfbWFwcGluZy5oIGIvYWxzYW1peGVyL3ZvbHVtZV9tYXBwaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQyNTFkNgotLS0gL2Rldi9udWxsCisrKyBiL2Fsc2FtaXhlci92b2x1bWVfbWFwcGluZy5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgVk9MVU1FX01BUFBJTkdfSF9JTkNMVURFRAorI2RlZmluZSBWT0xVTUVfTUFQUElOR19IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxhbHNhL2Fzb3VuZGxpYi5oPgorCitkb3VibGUgZ2V0X25vcm1hbGl6ZWRfcGxheWJhY2tfdm9sdW1lKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sCisJCQkJICAgICAgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsKTsKK2RvdWJsZSBnZXRfbm9ybWFsaXplZF9jYXB0dXJlX3ZvbHVtZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLAorCQkJCSAgICAgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsKTsKK2ludCBzZXRfbm9ybWFsaXplZF9wbGF5YmFja192b2x1bWUoc25kX21peGVyX2VsZW1fdCAqZWxlbSwKKwkJCQkgICBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsCisJCQkJICAgZG91YmxlIHZvbHVtZSwKKwkJCQkgICBpbnQgZGlyKTsKK2ludCBzZXRfbm9ybWFsaXplZF9jYXB0dXJlX3ZvbHVtZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLAorCQkJCSAgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsLAorCQkJCSAgZG91YmxlIHZvbHVtZSwKKwkJCQkgIGludCBkaXIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2Fsc2FtaXhlci93aWRnZXQuYyBiL2Fsc2FtaXhlci93aWRnZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWRhNGMyCi0tLSAvZGV2L251bGwKKysrIGIvYWxzYW1peGVyL3dpZGdldC5jCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogd2lkZ2V0LmMgLSBoYW5kbGVzIHdpZGdldCBvYmplY3RzIGFuZCB0aGUgd2lkZ2V0IHN0YWNrCisgKiBDb3B5cmlnaHQgKGMpIENsZW1lbnMgTGFkaXNjaCA8Y2xlbWVuc0BsYWRpc2NoLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgImFjb25maWcuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx0ZXJtLmg+CisjaW5jbHVkZSAiZGllLmgiCisjaW5jbHVkZSAid2lkZ2V0LmgiCisKK2ludCBzY3JlZW5fbGluZXM7CitpbnQgc2NyZWVuX2NvbHM7CisKK3N0YXRpYyBpbnQgY3Vyc29yX3Zpc2liaWxpdHkgPSAtMTsKKworc3RhdGljIHZvaWQgd2lkZ2V0X2hhbmRsZV9rZXkoaW50IGtleSkKK3sKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX2N1cnNvcl92aXNpYmlsaXR5KHZvaWQpCit7CisJc3RydWN0IHdpZGdldCAqYWN0aXZlX3dpZGdldDsKKworCWFjdGl2ZV93aWRnZXQgPSBnZXRfYWN0aXZlX3dpZGdldCgpOworCWlmIChhY3RpdmVfd2lkZ2V0ICYmCisJICAgIGFjdGl2ZV93aWRnZXQtPmN1cnNvcl92aXNpYmlsaXR5ICE9IGN1cnNvcl92aXNpYmlsaXR5KSB7CisJCWN1cnNvcl92aXNpYmlsaXR5ID0gYWN0aXZlX3dpZGdldC0+Y3Vyc29yX3Zpc2liaWxpdHk7CisJCWN1cnNfc2V0KGN1cnNvcl92aXNpYmlsaXR5KTsKKwl9Cit9CisKK3ZvaWQgd2lkZ2V0X2luaXQoc3RydWN0IHdpZGdldCAqd2lkZ2V0LCBpbnQgbGluZXNfLCBpbnQgY29scywgaW50IHksIGludCB4LAorCQkgY2h0eXBlIGJrZ2QsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlXSU5ET1cgKm9sZF93aW5kb3c7CisKKwlpZiAoeSA9PSBTQ1JFRU5fQ0VOVEVSKQorCQl5ID0gKHNjcmVlbl9saW5lcyAtIGxpbmVzXykgLyAyOworCWlmICh4ID09IFNDUkVFTl9DRU5URVIpCisJCXggPSAoc2NyZWVuX2NvbHMgLSBjb2xzKSAvIDI7CisKKwlvbGRfd2luZG93ID0gd2lkZ2V0LT53aW5kb3c7CisJd2lkZ2V0LT53aW5kb3cgPSBuZXd3aW4obGluZXNfLCBjb2xzLCB5LCB4KTsKKwlpZiAoIXdpZGdldC0+d2luZG93KQorCQlmYXRhbF9lcnJvcigiY2Fubm90IGNyZWF0ZSB3aW5kb3ciKTsKKwlrZXlwYWQod2lkZ2V0LT53aW5kb3csIFRSVUUpOworCW5vZGVsYXkod2lkZ2V0LT53aW5kb3csIFRSVUUpOworCWxlYXZlb2sod2lkZ2V0LT53aW5kb3csICEoZmxhZ3MgJiBXSURHRVRfQ1VSU09SX1ZJU0lCTEUpKTsKKwl3YmtnZHNldCh3aWRnZXQtPndpbmRvdywgYmtnZCk7CisJd2VyYXNlKHdpZGdldC0+d2luZG93KTsKKworCWlmIChmbGFncyAmIFdJREdFVF9CT1JERVIpCisJCWJveCh3aWRnZXQtPndpbmRvdywgMCwgMCk7CisJaWYgKGZsYWdzICYgV0lER0VUX1NVQldJTkRPVykgeworCQlpZiAod2lkZ2V0LT5zdWJ3aW5kb3cpCisJCQlkZWx3aW4od2lkZ2V0LT5zdWJ3aW5kb3cpOworCQl3aWRnZXQtPnN1YndpbmRvdyA9IGRlcndpbih3aWRnZXQtPndpbmRvdywKKwkJCQkJICAgbGluZXNfIC0gMiwgY29scyAtIDIsIDEsIDEpOworCQlpZiAoIXdpZGdldC0+c3Vid2luZG93KQorCQkJZmF0YWxfZXJyb3IoImNhbm5vdCBjcmVhdGUgc3Vid2luZG93Iik7CisJCXdia2dkc2V0KHdpZGdldC0+c3Vid2luZG93LCBia2dkKTsKKwl9CisJd2lkZ2V0LT5jdXJzb3JfdmlzaWJpbGl0eSA9ICEhKGZsYWdzICYgV0lER0VUX0NVUlNPUl9WSVNJQkxFKTsKKworCWlmICh3aWRnZXQtPnBhbmVsKSB7CisJCXJlcGxhY2VfcGFuZWwod2lkZ2V0LT5wYW5lbCwgd2lkZ2V0LT53aW5kb3cpOworCX0gZWxzZSB7CisJCXdpZGdldC0+cGFuZWwgPSBuZXdfcGFuZWwod2lkZ2V0LT53aW5kb3cpOworCQlpZiAoIXdpZGdldC0+cGFuZWwpCisJCQlmYXRhbF9lcnJvcigiY2Fubm90IGNyZWF0ZSBwYW5lbCIpOworCQlzZXRfcGFuZWxfdXNlcnB0cih3aWRnZXQtPnBhbmVsLCB3aWRnZXQpOworCX0KKworCWlmICghd2lkZ2V0LT5oYW5kbGVfa2V5KQorCQl3aWRnZXQtPmhhbmRsZV9rZXkgPSB3aWRnZXRfaGFuZGxlX2tleTsKKworCWlmIChvbGRfd2luZG93KQorCQlkZWx3aW4ob2xkX3dpbmRvdyk7CisKKwl1cGRhdGVfY3Vyc29yX3Zpc2liaWxpdHkoKTsKK30KKwordm9pZCB3aWRnZXRfZnJlZShzdHJ1Y3Qgd2lkZ2V0ICp3aWRnZXQpCit7CisJaWYgKHdpZGdldC0+cGFuZWwpIHsKKwkJZGVsX3BhbmVsKHdpZGdldC0+cGFuZWwpOworCQl3aWRnZXQtPnBhbmVsID0gTlVMTDsKKwl9CisJaWYgKHdpZGdldC0+c3Vid2luZG93KSB7CisJCWRlbHdpbih3aWRnZXQtPnN1YndpbmRvdyk7CisJCXdpZGdldC0+c3Vid2luZG93ID0gTlVMTDsKKwl9CisJaWYgKHdpZGdldC0+d2luZG93KSB7CisJCWRlbHdpbih3aWRnZXQtPndpbmRvdyk7CisJCXdpZGdldC0+d2luZG93ID0gTlVMTDsKKwl9CisKKwl1cGRhdGVfY3Vyc29yX3Zpc2liaWxpdHkoKTsKK30KKworc3RydWN0IHdpZGdldCAqZ2V0X2FjdGl2ZV93aWRnZXQodm9pZCkKK3sKKwlQQU5FTCAqYWN0aXZlX3BhbmVsOworCisJYWN0aXZlX3BhbmVsID0gcGFuZWxfYmVsb3coTlVMTCk7CisJaWYgKGFjdGl2ZV9wYW5lbCkKKwkJcmV0dXJuIHBhbmVsX3VzZXJwdHIoYWN0aXZlX3BhbmVsKTsKKwllbHNlCisJCXJldHVybiBOVUxMOworfQorCit2b2lkIHdpbmRvd19zaXplX2NoYW5nZWQodm9pZCkKK3sKKwlQQU5FTCAqcGFuZWwsICpiZWxvdzsKKwlzdHJ1Y3Qgd2lkZ2V0ICp3aWRnZXQ7CisKKwlnZXRtYXh5eChzdGRzY3IsIHNjcmVlbl9saW5lcywgc2NyZWVuX2NvbHMpOworCWlmICh0aWdldGZsYWcoInhlbmwiKSAhPSAxICYmIHRpZ2V0ZmxhZygiYW0iKSAhPSAxKQorCQktLXNjcmVlbl9saW5lczsKKworCWZvciAocGFuZWwgPSBwYW5lbF9iZWxvdyhOVUxMKTsgcGFuZWw7IHBhbmVsID0gYmVsb3cpIHsKKwkJYmVsb3cgPSBwYW5lbF9iZWxvdyhwYW5lbCk7CisJCXdpZGdldCA9IHBhbmVsX3VzZXJwdHIocGFuZWwpOworCQl3aWRnZXQtPndpbmRvd19zaXplX2NoYW5nZWQoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbHNhbWl4ZXIvd2lkZ2V0LmggYi9hbHNhbWl4ZXIvd2lkZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFkYjUyNgotLS0gL2Rldi9udWxsCisrKyBiL2Fsc2FtaXhlci93aWRnZXQuaApAQCAtMCwwICsxLDMzIEBACisjaWZuZGVmIFdJREdFVF9IX0lOQ0xVREVECisjZGVmaW5lIFdJREdFVF9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxwYW5lbC5oPgorCisjZGVmaW5lIFdJREdFVF9CT1JERVIJCTB4MQorI2RlZmluZSBXSURHRVRfU1VCV0lORE9XCTB4MgorI2RlZmluZSBXSURHRVRfQ1VSU09SX1ZJU0lCTEUJMHg0CisKKyNkZWZpbmUgU0NSRUVOX0NFTlRFUgktMQorCitzdHJ1Y3Qgd2lkZ2V0IHsKKwlXSU5ET1cgKndpbmRvdzsKKwlXSU5ET1cgKnN1YndpbmRvdzsgLyogb3B0aW9uYWw6IGNvbnRlbnRzIHdpdGhvdXQgYm9yZGVyICovCisJUEFORUwgKnBhbmVsOworCWludCBjdXJzb3JfdmlzaWJpbGl0eTsKKworCXZvaWQgKCpoYW5kbGVfa2V5KShpbnQga2V5KTsKKwl2b2lkICgqd2luZG93X3NpemVfY2hhbmdlZCkodm9pZCk7CisJdm9pZCAoKmNsb3NlKSh2b2lkKTsKK307CisKK2V4dGVybiBpbnQgc2NyZWVuX2xpbmVzOworZXh0ZXJuIGludCBzY3JlZW5fY29sczsKKwordm9pZCB3aWRnZXRfaW5pdChzdHJ1Y3Qgd2lkZ2V0ICp3aWRnZXQsCisJCSBpbnQgbGluZXNfLCBpbnQgY29scywgaW50IHksIGludCB4LAorCQkgY2h0eXBlIGJrZ2QsIHVuc2lnbmVkIGludCBmbGFncyk7Cit2b2lkIHdpZGdldF9mcmVlKHN0cnVjdCB3aWRnZXQgKndpZGdldCk7CitzdHJ1Y3Qgd2lkZ2V0ICpnZXRfYWN0aXZlX3dpZGdldCh2b2lkKTsKK3ZvaWQgd2luZG93X3NpemVfY2hhbmdlZCh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbHNhdWNtL01ha2VmaWxlLmFtIGIvYWxzYXVjbS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWJhNjc3Ci0tLSAvZGV2L251bGwKKysrIGIvYWxzYXVjbS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDEzIEBACitiaW5fUFJPR1JBTVMgPSBcCisgICAgICAgIGFsc2F1Y20KKworYWxzYXVjbV9TT1VSQ0VTID0gdXNlY2FzZS5jCisKK0lOQ0xVREVTID0gXAorICAgICAgICAgLVdhbGwgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUKKworYWxzYXVjbV9MREFERCA9IC1sYXNvdW5kCisKKyMgbG9jYWwgYnVpbGQKK0lOQ0xVREVTICs9IC1JJCh0b3Bfc3JjZGlyKS8uLi9hbHNhLWxpYi9pbmNsdWRlCithbHNhdWNtX0xEQUREICs9IC1MJCh0b3Bfc3JjZGlyKS8uLi9hbHNhLWxpYi9zcmMvLmxpYnMKZGlmZiAtLWdpdCBhL2Fsc2F1Y20vZ28uc2ggYi9hbHNhdWNtL2dvLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJhYWRkMWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbHNhdWNtL2dvLnNoCkBAIC0wLDAgKzEsNyBAQAorIyEvYmluL2Jhc2gKKworI0dEQj0iZ2RiIC0tYXJncyIKKworQUxTQV9DT05GSUdfVUNNPSIkSE9NRS9hbHNhL2Fsc2EtbGliL3Rlc3QvdWNtIiBcCitMRF9QUkVMT0FEPSIkSE9NRS9hbHNhL2Fsc2EtbGliL3NyYy8ubGlicy9saWJhc291bmQuc28iIFwKKyRHREIgLi9hbHNhdWNtICIkQCIKZGlmZiAtLWdpdCBhL2Fsc2F1Y20vdXNlY2FzZS5jIGIvYWxzYXVjbS91c2VjYXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM5NDY4MAotLS0gL2Rldi9udWxsCisrKyBiL2Fsc2F1Y20vdXNlY2FzZS5jCkBAIC0wLDAgKzEsNTA1IEBACisvKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogIFN1cHBvcnQgZm9yIHRoZSB2ZXJiL2RldmljZS9tb2RpZmllciBjb3JlIGxvZ2ljIGFuZCBBUEksIAorICogIGNvbW1hbmQgbGluZSB0b29sIGFuZCBmaWxlIHBhcnNlciB3YXMga2luZGx5IHNwb25zb3JlZCBieSAKKyAqICBUZXhhcyBJbnN0cnVtZW50cyBJbmMuCisgKiAgU3VwcG9ydCBmb3IgbXVsdGlwbGUgYWN0aXZlIG1vZGlmaWVycyBhbmQgZGV2aWNlcywgCisgKiAgdHJhbnNpdGlvbiBzZXF1ZW5jZXMsIG11bHRpcGxlIGNsaWVudCBhY2Nlc3MgYW5kIHVzZXIgZGVmaW5lZCB1c2UKKyAqICBjYXNlcyB3YXMga2luZGx5IHNwb25zb3JlZCBieSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgorICogCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgU2xpbUxvZ2ljIEx0ZAorICogIENvcHlyaWdodCAoQykgMjAxMCBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIFRleGFzIEluc3RydW1lbnRzIEluYy4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgUmVkIEhhdCBJbmMuCisgKiAgQXV0aG9yczogTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KKyAqICAgICAgICAgICBTdGVmYW4gU2NobWlkdCA8c3RlZmFuQHNsaW1sb2dpYy5jby51az4KKyAqICAgICAgICAgICBKdXN0aW4gWHUgPGp1c3RpbnhAc2xpbWxvZ2ljLmNvLnVrPgorICogICAgICAgICAgIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8YWxzYS9hc291bmRsaWIuaD4KKyNpbmNsdWRlIDxhbHNhL3VzZS1jYXNlLmg+CisjaW5jbHVkZSAiYWNvbmZpZy5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKworI2RlZmluZSBNQVhfQlVGIDI1NgorCitzdHJ1Y3QgY29udGV4dCB7CisJc25kX3VzZV9jYXNlX21ncl90ICp1Y19tZ3I7CisJY29uc3QgY2hhciAqY29tbWFuZDsKKwljaGFyICpjYXJkOworCWNoYXIgKiphcmd2OworCWludCBhcmdjOworCWludCBhcmdhOworCWNoYXIgKmJhdGNoOworCXVuc2lnbmVkIGludCBpbnRlcmFjdGl2ZToxOworCXVuc2lnbmVkIGludCBub19vcGVuOjE7CisJdW5zaWduZWQgaW50IGRvX2V4aXQ6MTsKK307CisKK2VudW0gdWNfY21kIHsKKwkvKiBtYW5hZ2VtZW50ICovCisJT01fVU5LTk9XTiA9IDAsCisJT01fT1BFTiwKKwlPTV9SRVNFVCwKKwlPTV9SRUxPQUQsCisJT01fTElTVENBUkRTLAorCU9NX0xJU1QyLAorCU9NX0xJU1QxLAorCisJLyogc2V0L2dldCAqLworCU9NX1NFVCwKKwlPTV9HRVQsCisJT01fR0VUSSwKKworCS8qIG1pc2MgKi8KKwlPTV9IRUxQLAorCU9NX1FVSVQsCit9OworCitzdHJ1Y3QgY21kIHsKKwlpbnQgY29kZTsKKwlpbnQgYXJnczsKKwl1bnNpZ25lZCBpbnQgb3BlbmNhcmQ6MTsKKwljb25zdCBjaGFyICppZDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY21kIGNtZHNbXSA9IHsKKwl7IE9NX09QRU4sIDEsIDAsICJvcGVuIiB9LAorCXsgT01fUkVTRVQsIDAsIDEsICJyZXNldCIgfSwKKwl7IE9NX1JFTE9BRCwgMCwgMSwgInJlbG9hZCIgfSwKKwl7IE9NX0xJU1RDQVJEUywgMCwgMCwgImxpc3RjYXJkcyIgfSwKKwl7IE9NX0xJU1QxLCAxLCAxLCAibGlzdDEiIH0sCisJeyBPTV9MSVNUMiwgMSwgMSwgImxpc3QiIH0sCisJeyBPTV9TRVQsIDIsIDEsICJzZXQiIH0sCisJeyBPTV9HRVQsIDEsIDEsICJnZXQiIH0sCisJeyBPTV9HRVRJLCAxLCAxLCAiZ2V0aSIgfSwKKwl7IE9NX0hFTFAsIDAsIDAsICJoZWxwIiB9LAorCXsgT01fUVVJVCwgMCwgMCwgInF1aXQiIH0sCisJeyBPTV9IRUxQLCAwLCAwLCAiaCIgfSwKKwl7IE9NX0hFTFAsIDAsIDAsICI/IiB9LAorCXsgT01fUVVJVCwgMCwgMCwgInEiIH0sCisJeyBPTV9VTktOT1dOLCAwLCAwLCBOVUxMIH0KK307CisKK3N0YXRpYyB2b2lkIGR1bXBfaGVscChzdHJ1Y3QgY29udGV4dCAqY29udGV4dCkKK3sKKwlpZiAoY29udGV4dC0+Y29tbWFuZCkKKwkJcHJpbnRmKCJVc2FnZTogJXMgPG9wdGlvbnM+IFtjb21tYW5kXVxuIiwgY29udGV4dC0+Y29tbWFuZCk7CisJcHJpbnRmKAorIlxuQXZhaWxhYmxlIG9wdGlvbnM6XG4iCisiICAtaCwtLWhlbHAgICAgICAgICAgICAgICAgICB0aGlzIGhlbHBcbiIKKyIgIC1jLC0tY2FyZCBOQU1FICAgICAgICAgICAgIG9wZW4gY2FyZCBOQU1FXG4iCisiICAtaSwtLWludGVyYWN0aXZlICAgICAgICAgICBpbnRlcmFjdGl2ZSBtb2RlXG4iCisiICAtYiwtLWJhdGNoIEZJTEUgICAgICAgICAgICBiYXRjaCBtb2RlICh1c2UgJy0nIGZvciB0aGUgc3RkaW4gaW5wdXQpXG4iCisiICAtbiwtLW5vLW9wZW4gICAgICAgICAgICAgICBkbyBub3Qgb3BlbiBmaXJzdCBjYXJkIGZvdW5kXG4iCisiXG5BdmFpbGFibGUgY29tbWFuZHM6XG4iCisiICBvcGVuIE5BTUUgICAgICAgICAgICAgICAgICBvcGVuIGNhcmQgTkFNRVxuIgorIiAgcmVzZXQgICAgICAgICAgICAgICAgICAgICAgcmVzZXQgc291bmQgY2FyZCB0byBkZWZhdWx0IHN0YXRlXG4iCisiICByZWxvYWQgICAgICAgICAgICAgICAgICAgICByZWxvYWQgY29uZmlndXJhdGlvblxuIgorIiAgbGlzdGNhcmRzICAgICAgICAgICAgICAgICAgbGlzdCBhdmFpbGFibGUgY2FyZHNcbiIKKyIgIGxpc3QgSURFTlRJRklFUiAgICAgICAgICAgIGxpc3QgY29tbWFuZFxuIgorIiAgZ2V0IElERU5USUZJRVIgICAgICAgICAgICAgZ2V0IHN0cmluZyB2YWx1ZVxuIgorIiAgZ2V0aSBJREVOVElGSUVSICAgICAgICAgICAgZ2V0IGludGVnZXIgdmFsdWVcbiIKKyIgIHNldCBJREVOVElGSUVSIFZBTFVFICAgICAgIHNldCBzdHJpbmcgdmFsdWVcbiIKKyIgIGgsaGVscCAgICAgICAgICAgICAgICAgICAgIGhlbHBcbiIKKyIgIHEscXVpdCAgICAgICAgICAgICAgICAgICAgIHF1aXRcbiIKKyk7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfbGluZShzdHJ1Y3QgY29udGV4dCAqY29udGV4dCwgY2hhciAqbGluZSkKK3sKKwljaGFyICpzdGFydCwgKipuYXJndjsKKwlpbnQgYzsKKworCWNvbnRleHQtPmFyZ2MgPSAwOworCXdoaWxlICgqbGluZSkgeworCQl3aGlsZSAoKmxpbmUgJiYgKCpsaW5lID09ICcgJyB8fCAqbGluZSA9PSAnXHQnIHx8CisJCQkJCQkJKmxpbmUgPT0gJ1xuJykpCisJCQlsaW5lKys7CisJCWMgPSAqbGluZTsKKwkJaWYgKGMgPT0gJ1wiJyB8fCBjID09ICdcJycpIHsKKwkJCXN0YXJ0ID0gKytsaW5lOworCQkJd2hpbGUgKCpsaW5lICYmICpsaW5lICE9IGMpCisJCQkJbGluZSsrOworCQkJaWYgKCpsaW5lKSB7CisJCQkJKmxpbmUgPSAnXDAnOworCQkJCWxpbmUrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN0YXJ0ID0gbGluZTsKKwkJCXdoaWxlICgqbGluZSAmJiAqbGluZSAhPSAnICcgJiYgKmxpbmUgIT0gJ1x0JyAmJgorCQkJICAgICAgICpsaW5lICE9ICdcbicpCisJCQkJbGluZSsrOworCQkJaWYgKCpsaW5lKSB7CisJCQkJKmxpbmUgPSAnXDAnOworCQkJCWxpbmUrKzsKKwkJCX0KKwkJfQorCQlpZiAoc3RhcnRbMF0gPT0gJ1wwJyAmJiBjb250ZXh0LT5hcmdjID09IDApCisJCQlyZXR1cm4gMDsKKwkJaWYgKGNvbnRleHQtPmFyZ2MgKyAxID49IGNvbnRleHQtPmFyZ2EpIHsKKwkJCWNvbnRleHQtPmFyZ2EgKz0gNDsKKwkJCW5hcmd2ID0gcmVhbGxvYyhjb250ZXh0LT5hcmd2LAorCQkJCQljb250ZXh0LT5hcmdhICogc2l6ZW9mKGNoYXIgKikpOworCQkJaWYgKG5hcmd2ID09IE5VTEwpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQljb250ZXh0LT5hcmd2ID0gbmFyZ3Y7CisJCX0KKwkJY29udGV4dC0+YXJndltjb250ZXh0LT5hcmdjKytdID0gc3RhcnQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX29uZShzdHJ1Y3QgY29udGV4dCAqY29udGV4dCwgc3RydWN0IGNtZCAqY21kLCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICoqbGlzdCwgKnN0cjsKKwlsb25nIGx2YWw7CisJaW50IGVyciwgaSwgaiwgZW50cmllczsKKworCWlmIChjbWQtPm9wZW5jYXJkICYmIGNvbnRleHQtPnVjX21nciA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGNvbW1hbmQgJyVzJyByZXF1aXJlcyBhbiBvcGVuIGNhcmRcbiIsCisJCQkJY29udGV4dC0+Y29tbWFuZCwgY21kLT5pZCk7CisJCXJldHVybiAwOworCX0KKwlzd2l0Y2ggKGNtZC0+Y29kZSkgeworCWNhc2UgT01fT1BFTjoKKwkJaWYgKGNvbnRleHQtPnVjX21ncikKKwkJCXNuZF91c2VfY2FzZV9tZ3JfY2xvc2UoY29udGV4dC0+dWNfbWdyKTsKKwkJY29udGV4dC0+dWNfbWdyID0gTlVMTDsKKwkJZnJlZShjb250ZXh0LT5jYXJkKTsKKwkJY29udGV4dC0+Y2FyZCA9IHN0cmR1cChhcmd2WzBdKTsKKwkJZXJyID0gc25kX3VzZV9jYXNlX21ncl9vcGVuKCZjb250ZXh0LT51Y19tZ3IsIGNvbnRleHQtPmNhcmQpOworCQlpZiAoZXJyIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIiVzOiBlcnJvciBmYWlsZWQgdG8gb3BlbiBzb3VuZCBjYXJkICVzOiAlc1xuIiwKKwkJCQljb250ZXh0LT5jb21tYW5kLCBjb250ZXh0LT5jYXJkLAorCQkJCXNuZF9zdHJlcnJvcihlcnIpKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBPTV9SRVNFVDoKKwkJZXJyID0gc25kX3VzZV9jYXNlX21ncl9yZXNldChjb250ZXh0LT51Y19tZ3IpOworCQlpZiAoZXJyIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIiVzOiBlcnJvciBmYWlsZWQgdG8gcmVzZXQgc291bmQgY2FyZCAlczogJXNcbiIsCisJCQkJY29udGV4dC0+Y29tbWFuZCwgY29udGV4dC0+Y2FyZCwKKwkJCQlzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWJyZWFrOworCWNhc2UgT01fUkVMT0FEOgorCQllcnIgPSBzbmRfdXNlX2Nhc2VfbWdyX3JlbG9hZChjb250ZXh0LT51Y19tZ3IpOworCQlpZiAoZXJyIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIiVzOiBlcnJvciBmYWlsZWQgdG8gcmVsb2FkIG1hbmFnZXIgJXM6ICVzXG4iLAorCQkJCWNvbnRleHQtPmNvbW1hbmQsIGNvbnRleHQtPmNhcmQsCisJCQkJc25kX3N0cmVycm9yKGVycikpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlicmVhazsKKwljYXNlIE9NX0xJU1RDQVJEUzoKKwkJZXJyID0gc25kX3VzZV9jYXNlX2NhcmRfbGlzdCgmbGlzdCk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiJXM6IGVycm9yIGZhaWxlZCB0byBnZXQgY2FyZCBsaXN0OiAlc1xuIiwKKwkJCQljb250ZXh0LT5jb21tYW5kLAorCQkJCXNuZF9zdHJlcnJvcihlcnIpKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJaWYgKGVyciA9PSAwKSB7CisJCQlwcmludGYoIiAgbGlzdCBpcyBlbXB0eVxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgZXJyIC8gMjsgaSsrKSB7CisJCQlwcmludGYoIiAgJWk6ICVzXG4iLCBpLCBsaXN0W2kqMl0pOworCQkJaWYgKGxpc3RbaSoyKzFdKQorCQkJCXByaW50ZigiICAgICVzXG4iLCBsaXN0W2kqMisxXSk7CisJCX0KKwkJc25kX3VzZV9jYXNlX2ZyZWVfbGlzdChsaXN0LCBlcnIpOworCQlicmVhazsKKwljYXNlIE9NX0xJU1QxOgorCWNhc2UgT01fTElTVDI6CisJCXN3aXRjaCAoY21kLT5jb2RlKSB7CisJCWNhc2UgT01fTElTVDE6CisJCSAgICBlbnRyaWVzID0gMTsKKwkJICAgIGJyZWFrOworCQljYXNlIE9NX0xJU1QyOgorCQkgICAgZW50cmllcyA9IDI7CisJCSAgICBicmVhazsKKwkJfQorCisJCWVyciA9IHNuZF91c2VfY2FzZV9nZXRfbGlzdChjb250ZXh0LT51Y19tZ3IsCisJCQkJCSAgICBhcmd2WzBdLAorCQkJCQkgICAgJmxpc3QpOworCQlpZiAoZXJyIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIiVzOiBlcnJvciBmYWlsZWQgdG8gZ2V0IGxpc3QgJXM6ICVzXG4iLAorCQkJCWNvbnRleHQtPmNvbW1hbmQsIGFyZ3ZbMF0sCisJCQkJc25kX3N0cmVycm9yKGVycikpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlpZiAoZXJyID09IDApIHsKKwkJCXByaW50ZigiICBsaXN0IGlzIGVtcHR5XG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBlcnIgLyBlbnRyaWVzOyBpKyspIHsKKwkJCXByaW50ZigiICAlaTogJXNcbiIsIGksIGxpc3RbaSplbnRyaWVzXSk7CisJCQlmb3IgKGogPSAwOyBqIDwgZW50cmllcyAtIDE7IGorKykKKwkJCQlpZiAobGlzdFtpKmVudHJpZXMraisxXSkKKwkJCQkJcHJpbnRmKCIgICAgJXNcbiIsIGxpc3RbaSplbnRyaWVzK2orMV0pOworCQl9CisJCXNuZF91c2VfY2FzZV9mcmVlX2xpc3QobGlzdCwgZXJyKTsKKwkJYnJlYWs7CisJY2FzZSBPTV9TRVQ6CisJCWVyciA9IHNuZF91c2VfY2FzZV9zZXQoY29udGV4dC0+dWNfbWdyLCBhcmd2WzBdLCBhcmd2WzFdKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSIlczogZXJyb3IgZmFpbGVkIHRvIHNldCAlcz0lczogJXNcbiIsCisJCQkJY29udGV4dC0+Y29tbWFuZCwgYXJndlswXSwgYXJndlsxXSwKKwkJCQlzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWJyZWFrOworCWNhc2UgT01fR0VUOgorCQllcnIgPSBzbmRfdXNlX2Nhc2VfZ2V0KGNvbnRleHQtPnVjX21nciwgYXJndlswXSwgJnN0cik7CisJCWlmIChlcnIgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiJXM6IGVycm9yIGZhaWxlZCB0byBnZXQgJXM6ICVzXG4iLAorCQkJCWNvbnRleHQtPmNvbW1hbmQsIGFyZ3ZbMF0sCisJCQkJc25kX3N0cmVycm9yKGVycikpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlwcmludGYoIiAgJXM9JXNcbiIsIGFyZ3ZbMF0sIHN0cik7CisJCWZyZWUoKHZvaWQgKilzdHIpOworCQlicmVhazsKKwljYXNlIE9NX0dFVEk6CisJCWVyciA9IHNuZF91c2VfY2FzZV9nZXRpKGNvbnRleHQtPnVjX21nciwgYXJndlswXSwgJmx2YWwpOworCQlpZiAoZXJyIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIiVzOiBlcnJvciBmYWlsZWQgdG8gZ2V0IGludGVnZXIgJXM6ICVzXG4iLAorCQkJCWNvbnRleHQtPmNvbW1hbmQsIGFyZ3ZbMF0sCisJCQkJc25kX3N0cmVycm9yKGVycikpOworCQkJcmV0dXJuIGx2YWw7CisJCX0KKwkJcHJpbnRmKCIgICVzPSVsaVxuIiwgYXJndlswXSwgbHZhbCk7CisJCWJyZWFrOworCWNhc2UgT01fUVVJVDoKKwkJY29udGV4dC0+ZG9fZXhpdCA9IDE7CisJCWJyZWFrOworCWNhc2UgT01fSEVMUDoKKwkJZHVtcF9oZWxwKGNvbnRleHQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiB1bmltcGxlbWVudGVkIGNvbW1hbmQgJyVzJ1xuIiwKKwkJCQljb250ZXh0LT5jb21tYW5kLCBjbWQtPmlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX2NvbW1hbmRzKHN0cnVjdCBjb250ZXh0ICpjb250ZXh0KQoreworCWNoYXIgKmNvbW1hbmQsICoqYXJndjsKKwlzdHJ1Y3QgY21kICpjbWQ7CisJaW50IGksIGFjbnQsIGVycjsKKworCWZvciAoaSA9IDA7IGkgPCBjb250ZXh0LT5hcmdjICYmICFjb250ZXh0LT5kb19leGl0OyBpKyspIHsKKwkJY29tbWFuZCA9IGNvbnRleHQtPmFyZ3ZbaV07CisJCWZvciAoY21kID0gY21kczsgY21kLT5pZCAhPSBOVUxMOyBjbWQrKykgeworCQkJaWYgKHN0cmNtcChjbWQtPmlkLCBjb21tYW5kKSA9PSAwKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChjbWQtPmlkID09IE5VTEwpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6IHVua25vd24gY29tbWFuZCAnJXMnXG4iLAorCQkJCQkJY29udGV4dC0+Y29tbWFuZCwgY29tbWFuZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlhY250ID0gY29udGV4dC0+YXJnYyAtIChpICsgMSk7CisJCWlmIChhY250IDwgY21kLT5hcmdzKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBleHBlY3RlZCAlaSBhcmd1bWVudHMgKGdvdCAlaSlcbiIsCisJCQkJCWNvbnRleHQtPmNvbW1hbmQsIGNtZC0+YXJncywgYWNudCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlhcmd2ID0gY29udGV4dC0+YXJndiArIGkgKyAxOworCQllcnIgPSBkb19vbmUoY29udGV4dCwgY21kLCBhcmd2KTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlpICs9IGNtZC0+YXJnczsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG15X2V4aXQoc3RydWN0IGNvbnRleHQgKmNvbnRleHQsIGludCBleGl0Y29kZSkKK3sKKwlpZiAoY29udGV4dC0+dWNfbWdyKQorCQlzbmRfdXNlX2Nhc2VfbWdyX2Nsb3NlKGNvbnRleHQtPnVjX21ncik7CisJaWYgKGNvbnRleHQtPmFyZ2EgPiAwKQorCQlmcmVlKGNvbnRleHQtPmFyZ3YpOworCWlmIChjb250ZXh0LT5jYXJkKQorCQlmcmVlKGNvbnRleHQtPmNhcmQpOworCWlmIChjb250ZXh0LT5iYXRjaCkKKwkJZnJlZShjb250ZXh0LT5iYXRjaCk7CisJZnJlZShjb250ZXh0KTsKKwlleGl0KGV4aXRjb2RlKTsKK30KKworZW51bSB7CisJT1BUX1ZFUlNJT04gPSAxLAorfTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBzaG9ydF9vcHRpb25zW10gPSAiaGI6YzppbiI7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJCXsiaGVscCIsIDAsIDAsICdoJ30sCisJCXsidmVyc2lvbiIsIDAsIDAsIE9QVF9WRVJTSU9OfSwKKwkJeyJjYXJkIiwgMSwgMCwgJ2MnfSwKKwkJeyJpbnRlcmFjdGl2ZSIsIDAsIDAsICdpJ30sCisJCXsiYmF0Y2giLCAxLCAwLCAnYid9LAorCQl7Im5vLW9wZW4iLCAwLCAwLCAnbid9LAorCQl7MCwgMCwgMCwgMH0KKwl9OworCXN0cnVjdCBjb250ZXh0ICpjb250ZXh0OworCWNvbnN0IGNoYXIgKmNvbW1hbmQgPSBhcmd2WzBdOworCWNvbnN0IGNoYXIgKipsaXN0OworCWludCBjLCBlcnIsIG9wdGlvbl9pbmRleDsKKwljaGFyIGNtZFtNQVhfQlVGXTsKKwlGSUxFICppbjsKKworCWNvbnRleHQgPSBjYWxsb2MoMSwgc2l6ZW9mKCpjb250ZXh0KSk7CisJaWYgKGNvbnRleHQgPT0gTlVMTCkKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwljb250ZXh0LT5jb21tYW5kID0gY29tbWFuZDsKKwl3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCBzaG9ydF9vcHRpb25zLAorCQkJCSBsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpKSAhPSAtMSkgeworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnaCc6CisJCQlkdW1wX2hlbHAoY29udGV4dCk7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfVkVSU0lPTjoKKwkJCXByaW50ZigiJXM6IHZlcnNpb24gIiBTTkRfVVRJTF9WRVJTSU9OX1NUUiAiXG4iLCBjb21tYW5kKTsKKwkJCWJyZWFrOworCQljYXNlICdjJzoKKwkJCWlmIChjb250ZXh0LT5jYXJkKQorCQkJCWZyZWUoY29udGV4dC0+Y2FyZCk7CisJCQljb250ZXh0LT5jYXJkID0gc3RyZHVwKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnaSc6CisJCQljb250ZXh0LT5pbnRlcmFjdGl2ZSA9IDE7CisJCQljb250ZXh0LT5iYXRjaCA9IE5VTEw7CisJCQlicmVhazsKKwkJY2FzZSAnYic6CisJCQljb250ZXh0LT5iYXRjaCA9IHN0cmR1cChvcHRhcmcpOworCQkJY29udGV4dC0+aW50ZXJhY3RpdmUgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgJ24nOgorCQkJY29udGV4dC0+bm9fb3BlbiA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZwcmludGYoc3RkZXJyLCAiVHJ5ICclcyAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuIiwgY29tbWFuZCk7CisJCQlteV9leGl0KGNvbnRleHQsIEVYSVRfRkFJTFVSRSk7CisJCX0KKwl9CisKKwlpZiAoIWNvbnRleHQtPm5vX29wZW4gJiYgY29udGV4dC0+Y2FyZCA9PSBOVUxMKSB7CisJCWVyciA9IHNuZF91c2VfY2FzZV9jYXJkX2xpc3QoJmxpc3QpOworCQlpZiAoZXJyIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICIlczogdW5hYmxlIHRvIG9idGFpbiBjYXJkIGxpc3Q6ICVzXG4iLCBjb21tYW5kLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQlteV9leGl0KGNvbnRleHQsIEVYSVRfRkFJTFVSRSk7CisJCX0KKwkJaWYgKGVyciA9PSAwKSB7CisJCQlwcmludGYoIk5vIGNhcmQgZm91bmRcbiIpOworCQkJbXlfZXhpdChjb250ZXh0LCBFWElUX1NVQ0NFU1MpOworCQl9CisJCWNvbnRleHQtPmNhcmQgPSBzdHJkdXAobGlzdFswXSk7CisJCXNuZF91c2VfY2FzZV9mcmVlX2xpc3QobGlzdCwgZXJyKTsKKwl9CisKKwkvKiBvcGVuIGxpYnJhcnkgKi8KKwlpZiAoIWNvbnRleHQtPm5vX29wZW4pIHsKKwkJZXJyID0gc25kX3VzZV9jYXNlX21ncl9vcGVuKCZjb250ZXh0LT51Y19tZ3IsCisJCQkJCSAgICBjb250ZXh0LT5jYXJkKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSIlczogZXJyb3IgZmFpbGVkIHRvIG9wZW4gc291bmQgY2FyZCAlczogJXNcbiIsCisJCQkJY29tbWFuZCwgY29udGV4dC0+Y2FyZCwgc25kX3N0cmVycm9yKGVycikpOworCQkJbXlfZXhpdChjb250ZXh0LCBFWElUX0ZBSUxVUkUpOworCQl9CisJfQorCisJLyogcGFyc2UgYW5kIGV4ZWN1dGUgYW55IGNvbW1hbmQgbGluZSBjb21tYW5kcyAqLworCWlmIChhcmdjID4gb3B0aW5kKSB7CisJCWNvbnRleHQtPmFyZ3YgPSBhcmd2ICsgb3B0aW5kOworCQljb250ZXh0LT5hcmdjID0gYXJnYyAtIG9wdGluZDsKKwkJZXJyID0gZG9fY29tbWFuZHMoY29udGV4dCk7CisJCWlmIChlcnIgPCAwKQorCQkJbXlfZXhpdChjb250ZXh0LCBFWElUX0ZBSUxVUkUpOworCX0KKworCWlmICghY29udGV4dC0+aW50ZXJhY3RpdmUgJiYgIWNvbnRleHQtPmJhdGNoKQorCQlteV9leGl0KGNvbnRleHQsIEVYSVRfU1VDQ0VTUyk7CisKKwlpZiAoY29udGV4dC0+aW50ZXJhY3RpdmUpIHsKKwkJcHJpbnRmKCIlczogSW50ZXJhY2l2ZSBtb2RlIC0gJ3EnIHRvIHF1aXRcbiIsIGNvbW1hbmQpOworCQlpbiA9IHN0ZGluOworCX0gZWxzZSB7CisJCWlmIChzdHJjbXAoY29udGV4dC0+YmF0Y2gsICItIikgPT0gMCkgeworCQkJaW4gPSBzdGRpbjsKKwkJfSBlbHNlIHsKKwkJCWluID0gZm9wZW4oY29udGV4dC0+YmF0Y2gsICJyIik7CisJCQlpZiAoaW4gPT0gTlVMTCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGVycm9yIGZhaWxlZCB0byBvcGVuIGZpbGUgJyVzJzogJXNcbiIsCisJCQkJCWNvbW1hbmQsIGNvbnRleHQtPmJhdGNoLCBzdHJlcnJvcigtZXJybm8pKTsKKwkJCQlteV9leGl0KGNvbnRleHQsIEVYSVRfRkFJTFVSRSk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBydW4gdGhlIGludGVyYWN0aXZlIGNvbW1hbmQgcGFyc2VyIGFuZCBoYW5kbGVyICovCisJd2hpbGUgKCFjb250ZXh0LT5kb19leGl0ICYmICFmZW9mKGluKSkgeworCQlpZiAoY29udGV4dC0+aW50ZXJhY3RpdmUpCisJCQlwcmludGYoIiVzPj4gIiwgYXJndlswXSk7CisJCWZmbHVzaChzdGRpbik7CisJCWlmIChmZ2V0cyhjbWQsIE1BWF9CVUYsIGluKSA9PSBOVUxMKQorCQkJYnJlYWs7CisJCWVyciA9IHBhcnNlX2xpbmUoY29udGV4dCwgY21kKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6IHVuYWJsZSB0byBwYXJzZSBsaW5lXG4iLAorCQkJCWNvbW1hbmQpOworCQkJbXlfZXhpdChjb250ZXh0LCBFWElUX0ZBSUxVUkUpOworCQl9CisJCWVyciA9IGRvX2NvbW1hbmRzKGNvbnRleHQpOworCQlpZiAoZXJyIDwgMCkgeworCQkJaWYgKGNvbnRleHQtPmludGVyYWN0aXZlKQorCQkJCXByaW50ZigiXl5eIGVycm9yLCB0cnkgYWdhaW5cbiIpOworCQkJZWxzZQorCQkJCW15X2V4aXQoY29udGV4dCwgRVhJVF9GQUlMVVJFKTsKKwkJfQorCX0KKwkKKwlpZiAoaW4gIT0gc3RkaW4pCisJCWZjbG9zZShpbik7CisKKwlteV9leGl0KGNvbnRleHQsIEVYSVRfU1VDQ0VTUyk7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2FtaWRpL01ha2VmaWxlLmFtIGIvYW1pZGkvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIzMWE2NwotLS0gL2Rldi9udWxsCisrKyBiL2FtaWRpL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNSBAQAorSU5DTFVERVMgPSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorRVhUUkFfRElTVCA9IGFtaWRpLjEKKworYmluX1BST0dSQU1TID0gYW1pZGkKK21hbl9NQU5TID0gYW1pZGkuMQpkaWZmIC0tZ2l0IGEvYW1pZGkvYW1pZGkuMSBiL2FtaWRpL2FtaWRpLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU4ZDY1YwotLS0gL2Rldi9udWxsCisrKyBiL2FtaWRpL2FtaWRpLjEKQEAgLTAsMCArMSwxNTUgQEAKKy5USCBBTUlESSAxICIyNiBKdW4gMjAwNiIKKworLlNIIE5BTUUKK2FtaWRpIFwtIHJlYWQgZnJvbSBhbmQgd3JpdGUgdG8gQUxTQSBSYXdNSURJIHBvcnRzCisKKy5TSCBTWU5PUFNJUworXGZCYW1pZGlcZlAgW1xmSVwtcCBwb3J0XGZQXSBbXGZJXC1zIGZpbGVcZlAgfCBcZklcLVMgZGF0YVxmUF0KK1tcZklcLXIgZmlsZVxmUF0gW1xmSVwtZFxmUF0gW1xmSVwtdCBzZWNvbmRzXGZQXSBbXGZJXC1hXGZQXQorCisuU0ggREVTQ1JJUFRJT04KKy5CIGFtaWRpCitpcyBhIGNvbW1hbmQtbGluZSB1dGlsaXR5IHdoaWNoIGFsbG93cyB0byByZWNlaXZlIGFuZCBzZW5kCitTeXNFeCAoc3lzdGVtIGV4Y2x1c2l2ZSkgZGF0YSBmcm9tL3RvIGV4dGVybmFsIE1JREkgZGV2aWNlcy4KK0l0IGNhbiBhbHNvIHNlbmQgYW55IG90aGVyIE1JREkgY29tbWFuZHMuCisKKy5CIGFtaWRpCitoYW5kbGVzIG9ubHkgZmlsZXMgY29udGFpbmluZyByYXcgTUlESSBjb21tYW5kcywgd2l0aG91dCB0aW1pbmcKK2luZm9ybWF0aW9uLgorLkIgYW1pZGkKK2RvZXMgbm90IHN1cHBvcnQgU3RhbmRhcmQgTUlESSAoLm1pZCkgZmlsZXMsIGJ1dAorLkIgYXBsYXltaWRpKDEpCithbmQKKy5CIGFyZWNvcmRtaWRpKDEpCitkby4KKworLlNIIE9QVElPTlMKKworVXNlIHRoZQorLkkgXC1oLAorLkkgXC1WLAorLkkgXC1sLAorb3IKKy5JIFwtTAorb3B0aW9ucyB0byBkaXNwbGF5IGluZm9ybWF0aW9uOworb3IgdXNlIGF0IGxlYXN0IG9uZSBvZiB0aGUKKy5JIFwtcywKKy5JIFwtciwKKy5JIFwtUywKK29yCisuSSBcLWQKK29wdGlvbnMgdG8gc3BlY2lmeSB3aGF0IGRhdGEgdG8gc2VuZCBvciByZWNlaXZlLgorCisuVFAKKy5JIFwtaCwgXC1cLWhlbHAKK0hlbHA6IHByaW50cyBhIGxpc3Qgb2Ygb3B0aW9ucy4KKworLlRQCisuSSBcLVYsIFwtXC12ZXJzaW9uCitQcmludHMgdGhlIGN1cnJlbnQgdmVyc2lvbi4KKworLlRQCisuSSBcLWwsIFwtXC1saXN0XC1kZXZpY2VzCitQcmludHMgYSBsaXN0IG9mIGFsbCBoYXJkd2FyZSBNSURJIHBvcnRzLgorCisuVFAKKy5JIFwtTCwgXC1cLWxpc3RcLXJhd21pZGlzCitQcmludHMgYWxsIFJhd01JREkgZGVmaW5pdGlvbnMuCisodXNlZCB3aGVuIGRlYnVnZ2luZyBjb25maWd1cmF0aW9uIGZpbGVzKQorCisuVFAKKy5JIFwtcCwgXC1cLXBvcnQ9bmFtZQorU2V0cyB0aGUgbmFtZSBvZiB0aGUgQUxTQSBSYXdNSURJIHBvcnQgdG8gdXNlLgorSWYgdGhpcyBpcyBub3Qgc3BlY2lmaWVkLAorLkIgYW1pZGkKK3VzZXMgdGhlIGRlZmF1bHQgcG9ydCBkZWZpbmVkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKKyh0aGUgZGVmYXVsdCBmb3IgdGhpcyBpcyBwb3J0IDAgb24gY2FyZCAwLCB3aGljaCBtYXkgbm90IGV4aXN0KS4KKworLlRQCisuSSBcLXMsIFwtXC1zZW5kPWZpbGVuYW1lCitTZW5kcyB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBmaWxlIHRvIHRoZSBNSURJIHBvcnQuCitUaGUgZmlsZSBtdXN0IGNvbnRhaW4gcmF3IE1JREkgY29tbWFuZHMgKGUuZy4gYSAuc3l4IGZpbGUpOworZm9yIFN0YW5kYXJkIE1JREkgKC5taWQpIGZpbGVzLCB1c2UKKy5CIGFwbGF5bWlkaSgxKS4KKworLlRQCisuSSBcLXIsIFwtXC1yZWNlaXZlPWZpbGVuYW1lCitXcml0ZXMgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBNSURJIHBvcnQgaW50byB0aGUgc3BlY2lmaWVkIGZpbGUuCitUaGUgZmlsZSB3aWxsIGNvbnRhaW4gcmF3IE1JREkgY29tbWFuZHMgKHN1Y2ggYXMgaW4gYSAuc3l4IGZpbGUpOwordG8gcmVjb3JkIGEgU3RhbmRhcmQgTUlESSAoLm1pZCkgZmlsZSwgdXNlCisuQiBhcmVjb3JkbWlkaSgxKS4KKworLkIgYW1pZGkKK3dpbGwgZmlsdGVyIG91dCBhbnkgQWN0aXZlIFNlbnNpbmcgYnl0ZXMgKEZFaCksIHVubGVzcyB0aGUKKy5JIFwtYQorb3B0aW9uIGhhcyBiZWVuIGdpdmVuLgorCisuVFAKKy5JIFwtUywgXC1cLXNlbmRcLWhleD0iLi4uIgorU2VuZHMgdGhlIGJ5dGVzIHNwZWNpZmllZCBhcyBoZXhhZGVjaW1hbCBudW1iZXJzIHRvIHRoZSBNSURJIHBvcnQuCisKKy5UUAorLkkgXC1kLCBcLVwtZHVtcAorUHJpbnRzIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgTUlESSBwb3J0IGFzIGhleGFkZWNpbWFsIGJ5dGVzLgorQWN0aXZlIFNlbnNpbmcgYnl0ZXMgKEZFaCkgd2lsbCBub3QgYmUgc2hvd24sIHVubGVzcyB0aGUKKy5JIFwtYQorb3B0aW9uIGhhcyBiZWVuIGdpdmVuLgorCitUaGlzIG9wdGlvbiBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZy4KKworLlRQCisuSSBcLXQsIFwtXC10aW1lb3V0PXNlY29uZHMKK1N0b3BzIHJlY2VpdmluZyBkYXRhIHdoZW4gbm8gZGF0YSBoYXMgYmVlbiByZWNlaXZlZCBmb3IgdGhlIHNwZWNpZmllZAorYW1vdW50IG9mIHRpbWUuCisKK0lmIHRoaXMgb3B0aW9uIGhhcyBub3QgYmVlbiBnaXZlbiwgeW91IG11c3QgcHJlc3MgQ3RybCtDIChvciBraWxsCisuQiBhbWlkaVxmUikKK3RvIHN0b3AgcmVjZWl2aW5nIGRhdGEuCisKKy5UUAorLkkgXC1hLCBcLVwtYWN0aXZlXC1zZW5zaW5nCitEb2VzIG5vdCBpZ25vcmUgQWN0aXZlIFNlbnNpbmcgYnl0ZXMgKEZFaCkgd2hlbiBzYXZpbmcgb3IgcHJpbnRpbmcKK3JlY2VpdmVkIE1JREkgY29tbWFuZHMuCisKKy5TSCBFWEFNUExFUworCisuVFAKKy5CIGFtaWRpIFwtcCBodzowIFwtcyBteV9zZXR0aW5ncy5zeXgKK3dpbGwgc2VuZCB0aGUgTUlESSBjb21tYW5kcyBpbgorLkkgbXlfc2V0dGluZ3Muc3l4Cit0byBwb3J0CisuSSBodzowLgorCisuVFAKKy5CIGFtaWRpIFwtUyAnRjAgNDMgMTAgNEMgMDAgMDAgN0UgMDAgRjcnCitzZW5kcyBhbiBYRyBSZXNldCB0byB0aGUgZGVmYXVsdCBwb3J0LgorCisuVFAKKy5CIGFtaWRpIFwtcCBodzoxLDIgXC1TIEYwNDExMDQyMTEwQzAwMDAwMDAwMDA3NEY3IFwtciBkdW1wLnN5eCBcLXQgMQorc2VuZHMgYSBcKGxxUGFyYW1ldGVyIER1bXAgUmVxdWVzdFwocnEgdG8gYSBHUyBkZXZpY2UsIHNhdmVzIHRoZSByZWNlaXZlZAorcGFyYW1ldGVyIGRhdGEgdG8gdGhlIGZpbGUKKy5JIGR1bXAuc3l4LAorYW5kIHN0b3BzIGFmdGVyIHRoZSBkZXZpY2UgaGFzIGZpbmlzaGVkIHNlbmRpbmcgZGF0YQorKHdoZW4gbm8gZGF0YSBoYXMgYmVlbiByZWNlaXZlZCBmb3Igb25lIHNlY29uZCkuCisKKy5UUAorLkIgYW1pZGkgXC1wIHZpcnR1YWwgXC1kCitjcmVhdGVzIGEgdmlydHVhbCBSYXdNSURJIHBvcnQgYW5kIHByaW50cyBhbGwgZGF0YSBzZW50IHRvIHRoaXMgcG9ydC4KKworLlNIIEZJTEVTCisuSSAvdXNyL3NoYXJlL2Fsc2EvYWxzYS5jb25mCitkZWZhdWx0IHJhd21pZGkgZGVmaW5pdGlvbnMKKy5icgorLkkgL2V0Yy9hc291bmQuY29uZgorc3lzdGVtLXdpZGUgcmF3bWlkaSBkZWZpbml0aW9ucworLmJyCisuSSB+Ly5hc291bmRyYwordXNlciBzcGVjaWZpYyByYXdtaWRpIGRlZmluaXRpb25zCisKKy5TSCBTRUUgQUxTTworYXBsYXltaWRpKDEpCisuYnIKK2FyZWNvcmRtaWRpKDEpCisKKy5TSCBBVVRIT1IKK0NsZW1lbnMgTGFkaXNjaCA8Y2xlbWVuc0BsYWRpc2NoLmRlPgpkaWZmIC0tZ2l0IGEvYW1pZGkvYW1pZGkuYyBiL2FtaWRpL2FtaWRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VkZjE4YwotLS0gL2Rldi9udWxsCisrKyBiL2FtaWRpL2FtaWRpLmMKQEAgLTAsMCArMSw2MjAgQEAKKy8qCisgKiAgYW1pZGkuYyAtIHJlYWQgZnJvbS93cml0ZSB0byBSYXdNSURJIHBvcnRzCisgKgorICogIENvcHlyaWdodCAoYykgQ2xlbWVucyBMYWRpc2NoIDxjbGVtZW5zQGxhZGlzY2guZGU+CisgKgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjZGVmaW5lIF9HTlVfU09VUkNFCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8YWxzYS9hc291bmRsaWIuaD4KKyNpbmNsdWRlICJhY29uZmlnLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCitzdGF0aWMgaW50IGRvX2RldmljZV9saXN0LCBkb19yYXdtaWRpX2xpc3Q7CitzdGF0aWMgY2hhciAqcG9ydF9uYW1lID0gImRlZmF1bHQiOworc3RhdGljIGNoYXIgKnNlbmRfZmlsZV9uYW1lOworc3RhdGljIGNoYXIgKnJlY2VpdmVfZmlsZV9uYW1lOworc3RhdGljIGNoYXIgKnNlbmRfaGV4Oworc3RhdGljIGNoYXIgKnNlbmRfZGF0YTsKK3N0YXRpYyBpbnQgc2VuZF9kYXRhX2xlbmd0aDsKK3N0YXRpYyBpbnQgcmVjZWl2ZV9maWxlOworc3RhdGljIGludCBkdW1wOworc3RhdGljIGludCB0aW1lb3V0Oworc3RhdGljIGludCBzdG9wOworc3RhdGljIHNuZF9yYXdtaWRpX3QgKmlucHV0LCAqKmlucHV0cDsKK3N0YXRpYyBzbmRfcmF3bWlkaV90ICpvdXRwdXQsICoqb3V0cHV0cDsKKworc3RhdGljIHZvaWQgZXJyb3IoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCXZhX3N0YXJ0KGFwLCBmb3JtYXQpOworCXZmcHJpbnRmKHN0ZGVyciwgZm9ybWF0LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlwdXRjKCdcbicsIHN0ZGVycik7Cit9CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJcHJpbnRmKAorCQkiVXNhZ2U6IGFtaWRpIG9wdGlvbnNcbiIKKwkJIlxuIgorCQkiLWgsIC0taGVscCAgICAgICAgICAgICB0aGlzIGhlbHBcbiIKKwkJIi1WLCAtLXZlcnNpb24gICAgICAgICAgcHJpbnQgY3VycmVudCB2ZXJzaW9uXG4iCisJCSItbCwgLS1saXN0LWRldmljZXMgICAgIGxpc3QgYWxsIGhhcmR3YXJlIHBvcnRzXG4iCisJCSItTCwgLS1saXN0LXJhd21pZGlzICAgIGxpc3QgYWxsIFJhd01JREkgZGVmaW5pdGlvbnNcbiIKKwkJIi1wLCAtLXBvcnQ9bmFtZSAgICAgICAgc2VsZWN0IHBvcnQgYnkgbmFtZVxuIgorCQkiLXMsIC0tc2VuZD1maWxlICAgICAgICBzZW5kIHRoZSBjb250ZW50cyBvZiBhICguc3l4KSBmaWxlXG4iCisJCSItciwgLS1yZWNlaXZlPWZpbGUgICAgIHdyaXRlIHJlY2VpdmVkIGRhdGEgaW50byBhIGZpbGVcbiIKKwkJIi1TLCAtLXNlbmQtaGV4PVwiLi4uXCIgICBzZW5kIGhleGFkZWNpbWFsIGJ5dGVzXG4iCisJCSItZCwgLS1kdW1wICAgICAgICAgICAgIHByaW50IHJlY2VpdmVkIGRhdGEgYXMgaGV4YWRlY2ltYWwgYnl0ZXNcbiIKKwkJIi10LCAtLXRpbWVvdXQ9c2Vjb25kcyAgZXhpdHMgd2hlbiBubyBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkXG4iCisJCSIgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgc3BlY2lmaWVkIGR1cmF0aW9uXG4iCisJCSItYSwgLS1hY3RpdmUtc2Vuc2luZyAgIGRvbid0IGlnbm9yZSBhY3RpdmUgc2Vuc2luZyBieXRlc1xuIik7Cit9CisKK3N0YXRpYyB2b2lkIHZlcnNpb24odm9pZCkKK3sKKwlwdXRzKCJhbWlkaSB2ZXJzaW9uICIgU05EX1VUSUxfVkVSU0lPTl9TVFIpOworfQorCitzdGF0aWMgdm9pZCAqbXlfbWFsbG9jKHNpemVfdCBzaXplKQoreworCXZvaWQgKnAgPSBtYWxsb2Moc2l6ZSk7CisJaWYgKCFwKSB7CisJCWVycm9yKCJvdXQgb2YgbWVtb3J5Iik7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyB2b2lkIGxpc3RfZGV2aWNlKHNuZF9jdGxfdCAqY3RsLCBpbnQgY2FyZCwgaW50IGRldmljZSkKK3sKKwlzbmRfcmF3bWlkaV9pbmZvX3QgKmluZm87CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpzdWJfbmFtZTsKKwlpbnQgc3Vicywgc3Vic19pbiwgc3Vic19vdXQ7CisJaW50IHN1YjsKKwlpbnQgZXJyOworCisJc25kX3Jhd21pZGlfaW5mb19hbGxvY2EoJmluZm8pOworCXNuZF9yYXdtaWRpX2luZm9fc2V0X2RldmljZShpbmZvLCBkZXZpY2UpOworCisJc25kX3Jhd21pZGlfaW5mb19zZXRfc3RyZWFtKGluZm8sIFNORF9SQVdNSURJX1NUUkVBTV9JTlBVVCk7CisJZXJyID0gc25kX2N0bF9yYXdtaWRpX2luZm8oY3RsLCBpbmZvKTsKKwlpZiAoZXJyID49IDApCisJCXN1YnNfaW4gPSBzbmRfcmF3bWlkaV9pbmZvX2dldF9zdWJkZXZpY2VzX2NvdW50KGluZm8pOworCWVsc2UKKwkJc3Vic19pbiA9IDA7CisKKwlzbmRfcmF3bWlkaV9pbmZvX3NldF9zdHJlYW0oaW5mbywgU05EX1JBV01JRElfU1RSRUFNX09VVFBVVCk7CisJZXJyID0gc25kX2N0bF9yYXdtaWRpX2luZm8oY3RsLCBpbmZvKTsKKwlpZiAoZXJyID49IDApCisJCXN1YnNfb3V0ID0gc25kX3Jhd21pZGlfaW5mb19nZXRfc3ViZGV2aWNlc19jb3VudChpbmZvKTsKKwllbHNlCisJCXN1YnNfb3V0ID0gMDsKKworCXN1YnMgPSBzdWJzX2luID4gc3Vic19vdXQgPyBzdWJzX2luIDogc3Vic19vdXQ7CisJaWYgKCFzdWJzKQorCQlyZXR1cm47CisKKwlmb3IgKHN1YiA9IDA7IHN1YiA8IHN1YnM7ICsrc3ViKSB7CisJCXNuZF9yYXdtaWRpX2luZm9fc2V0X3N0cmVhbShpbmZvLCBzdWIgPCBzdWJzX2luID8KKwkJCQkJICAgIFNORF9SQVdNSURJX1NUUkVBTV9JTlBVVCA6CisJCQkJCSAgICBTTkRfUkFXTUlESV9TVFJFQU1fT1VUUFVUKTsKKwkJc25kX3Jhd21pZGlfaW5mb19zZXRfc3ViZGV2aWNlKGluZm8sIHN1Yik7CisJCWVyciA9IHNuZF9jdGxfcmF3bWlkaV9pbmZvKGN0bCwgaW5mbyk7CisJCWlmIChlcnIgPCAwKSB7CisJCQllcnJvcigiY2Fubm90IGdldCByYXdtaWRpIGluZm9ybWF0aW9uICVkOiVkOiVkOiAlc1xuIiwKKwkJCSAgICAgIGNhcmQsIGRldmljZSwgc3ViLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQlyZXR1cm47CisJCX0KKwkJbmFtZSA9IHNuZF9yYXdtaWRpX2luZm9fZ2V0X25hbWUoaW5mbyk7CisJCXN1Yl9uYW1lID0gc25kX3Jhd21pZGlfaW5mb19nZXRfc3ViZGV2aWNlX25hbWUoaW5mbyk7CisJCWlmIChzdWIgPT0gMCAmJiBzdWJfbmFtZVswXSA9PSAnXDAnKSB7CisJCQlwcmludGYoIiVjJWMgIGh3OiVkLCVkICAgICVzIiwKKwkJCSAgICAgICBzdWIgPCBzdWJzX2luID8gJ0knIDogJyAnLAorCQkJICAgICAgIHN1YiA8IHN1YnNfb3V0ID8gJ08nIDogJyAnLAorCQkJICAgICAgIGNhcmQsIGRldmljZSwgbmFtZSk7CisJCQlpZiAoc3VicyA+IDEpCisJCQkJcHJpbnRmKCIgKCVkIHN1YmRldmljZXMpIiwgc3Vicyk7CisJCQlwdXRjaGFyKCdcbicpOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIiVjJWMgIGh3OiVkLCVkLCVkICAlc1xuIiwKKwkJCSAgICAgICBzdWIgPCBzdWJzX2luID8gJ0knIDogJyAnLAorCQkJICAgICAgIHN1YiA8IHN1YnNfb3V0ID8gJ08nIDogJyAnLAorCQkJICAgICAgIGNhcmQsIGRldmljZSwgc3ViLCBzdWJfbmFtZSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGxpc3RfY2FyZF9kZXZpY2VzKGludCBjYXJkKQoreworCXNuZF9jdGxfdCAqY3RsOworCWNoYXIgbmFtZVszMl07CisJaW50IGRldmljZTsKKwlpbnQgZXJyOworCisJc3ByaW50ZihuYW1lLCAiaHc6JWQiLCBjYXJkKTsKKwlpZiAoKGVyciA9IHNuZF9jdGxfb3BlbigmY3RsLCBuYW1lLCAwKSkgPCAwKSB7CisJCWVycm9yKCJjYW5ub3Qgb3BlbiBjb250cm9sIGZvciBjYXJkICVkOiAlcyIsIGNhcmQsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuOworCX0KKwlkZXZpY2UgPSAtMTsKKwlmb3IgKDs7KSB7CisJCWlmICgoZXJyID0gc25kX2N0bF9yYXdtaWRpX25leHRfZGV2aWNlKGN0bCwgJmRldmljZSkpIDwgMCkgeworCQkJZXJyb3IoImNhbm5vdCBkZXRlcm1pbmUgZGV2aWNlIG51bWJlcjogJXMiLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZGV2aWNlIDwgMCkKKwkJCWJyZWFrOworCQlsaXN0X2RldmljZShjdGwsIGNhcmQsIGRldmljZSk7CisJfQorCXNuZF9jdGxfY2xvc2UoY3RsKTsKK30KKworc3RhdGljIHZvaWQgZGV2aWNlX2xpc3Qodm9pZCkKK3sKKwlpbnQgY2FyZCwgZXJyOworCisJY2FyZCA9IC0xOworCWlmICgoZXJyID0gc25kX2NhcmRfbmV4dCgmY2FyZCkpIDwgMCkgeworCQllcnJvcigiY2Fubm90IGRldGVybWluZSBjYXJkIG51bWJlcjogJXMiLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybjsKKwl9CisJaWYgKGNhcmQgPCAwKSB7CisJCWVycm9yKCJubyBzb3VuZCBjYXJkIGZvdW5kIik7CisJCXJldHVybjsKKwl9CisJcHV0cygiRGlyIERldmljZSAgICBOYW1lIik7CisJZG8geworCQlsaXN0X2NhcmRfZGV2aWNlcyhjYXJkKTsKKwkJaWYgKChlcnIgPSBzbmRfY2FyZF9uZXh0KCZjYXJkKSkgPCAwKSB7CisJCQllcnJvcigiY2Fubm90IGRldGVybWluZSBjYXJkIG51bWJlcjogJXMiLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKGNhcmQgPj0gMCk7Cit9CisKK3N0YXRpYyB2b2lkIHJhd21pZGlfbGlzdCh2b2lkKQoreworCXNuZF9vdXRwdXRfdCAqb3V0cHV0OworCXNuZF9jb25maWdfdCAqY29uZmlnOworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHNuZF9jb25maWdfdXBkYXRlKCkpIDwgMCkgeworCQllcnJvcigic25kX2NvbmZpZ191cGRhdGUgZmFpbGVkOiAlcyIsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoKGVyciA9IHNuZF9vdXRwdXRfc3RkaW9fYXR0YWNoKCZvdXRwdXQsIHN0ZG91dCwgMCkpIDwgMCkgeworCQllcnJvcigic25kX291dHB1dF9zdGRpb19hdHRhY2ggZmFpbGVkOiAlcyIsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoc25kX2NvbmZpZ19zZWFyY2goc25kX2NvbmZpZywgInJhd21pZGkiLCAmY29uZmlnKSA+PSAwKSB7CisJCXB1dHMoIlJhd01JREkgbGlzdDoiKTsKKwkJc25kX2NvbmZpZ19zYXZlKGNvbmZpZywgb3V0cHV0KTsKKwl9CisJc25kX291dHB1dF9jbG9zZShvdXRwdXQpOworfQorCitzdGF0aWMgdm9pZCBsb2FkX2ZpbGUodm9pZCkKK3sKKwlpbnQgZmQ7CisJb2ZmX3QgbGVuZ3RoOworCisJZmQgPSBvcGVuKHNlbmRfZmlsZV9uYW1lLCBPX1JET05MWSk7CisJaWYgKGZkID09IC0xKSB7CisJCWVycm9yKCJjYW5ub3Qgb3BlbiAlcyAtICVzIiwgc2VuZF9maWxlX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybjsKKwl9CisJbGVuZ3RoID0gbHNlZWsoZmQsIDAsIFNFRUtfRU5EKTsKKwlpZiAobGVuZ3RoID09IChvZmZfdCktMSkgeworCQllcnJvcigiY2Fubm90IGRldGVybWluZSBsZW5ndGggb2YgJXM6ICVzIiwgc2VuZF9maWxlX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gX2Vycm9yOworCX0KKwlzZW5kX2RhdGEgPSBteV9tYWxsb2MobGVuZ3RoKTsKKwlsc2VlayhmZCwgMCwgU0VFS19TRVQpOworCWlmIChyZWFkKGZkLCBzZW5kX2RhdGEsIGxlbmd0aCkgIT0gbGVuZ3RoKSB7CisJCWVycm9yKCJjYW5ub3QgcmVhZCBmcm9tICVzOiAlcyIsIHNlbmRfZmlsZV9uYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlnb3RvIF9lcnJvcjsKKwl9CisJaWYgKGxlbmd0aCA+PSA0ICYmICFtZW1jbXAoc2VuZF9kYXRhLCAiTVRoZCIsIDQpKSB7CisJCWVycm9yKCIlcyBpcyBhIFN0YW5kYXJkIE1JREkgRmlsZTsgdXNlIGFwbGF5bWlkaSB0byBzZW5kIGl0Iiwgc2VuZF9maWxlX25hbWUpOworCQlnb3RvIF9lcnJvcjsKKwl9CisJc2VuZF9kYXRhX2xlbmd0aCA9IGxlbmd0aDsKKwlnb3RvIF9leGl0OworX2Vycm9yOgorCWZyZWUoc2VuZF9kYXRhKTsKKwlzZW5kX2RhdGEgPSBOVUxMOworX2V4aXQ6CisJY2xvc2UoZmQpOworfQorCitzdGF0aWMgaW50IGhleF92YWx1ZShjaGFyIGMpCit7CisJaWYgKCcwJyA8PSBjICYmIGMgPD0gJzknKQorCQlyZXR1cm4gYyAtICcwJzsKKwlpZiAoJ0EnIDw9IGMgJiYgYyA8PSAnRicpCisJCXJldHVybiBjIC0gJ0EnICsgMTA7CisJaWYgKCdhJyA8PSBjICYmIGMgPD0gJ2YnKQorCQlyZXR1cm4gYyAtICdhJyArIDEwOworCWVycm9yKCJpbnZhbGlkIGNoYXJhY3RlciAlYyIsIGMpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfZGF0YSh2b2lkKQoreworCWNvbnN0IGNoYXIgKnA7CisJaW50IGksIHZhbHVlOworCisJc2VuZF9kYXRhID0gbXlfbWFsbG9jKHN0cmxlbihzZW5kX2hleCkpOyAvKiBndWVzc3RpbWF0ZSAqLworCWkgPSAwOworCXZhbHVlID0gLTE7IC8qIHZhbHVlIGlzID49IDAgd2hlbiB0aGUgZmlyc3QgaGV4IGRpZ2l0IG9mIGEgYnl0ZSBoYXMgYmVlbiByZWFkICovCisJZm9yIChwID0gc2VuZF9oZXg7ICpwOyArK3ApIHsKKwkJaW50IGRpZ2l0OworCQlpZiAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikqcCkpIHsKKwkJCWlmICh2YWx1ZSA+PSAwKSB7CisJCQkJc2VuZF9kYXRhW2krK10gPSB2YWx1ZTsKKwkJCQl2YWx1ZSA9IC0xOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJZGlnaXQgPSBoZXhfdmFsdWUoKnApOworCQlpZiAoZGlnaXQgPCAwKSB7CisJCQlzZW5kX2RhdGEgPSBOVUxMOworCQkJcmV0dXJuOworCQl9CisJCWlmICh2YWx1ZSA8IDApIHsKKwkJCXZhbHVlID0gZGlnaXQ7CisJCX0gZWxzZSB7CisJCQlzZW5kX2RhdGFbaSsrXSA9ICh2YWx1ZSA8PCA0KSB8IGRpZ2l0OworCQkJdmFsdWUgPSAtMTsKKwkJfQorCX0KKwlpZiAodmFsdWUgPj0gMCkKKwkJc2VuZF9kYXRhW2krK10gPSB2YWx1ZTsKKwlzZW5kX2RhdGFfbGVuZ3RoID0gaTsKK30KKworLyoKKyAqIHByaW50cyBNSURJIGNvbW1hbmRzLCBmb3JtYXR0aW5nIHRoZW0gbmljZWx5CisgKi8KK3N0YXRpYyB2b2lkIHByaW50X2J5dGUodW5zaWduZWQgY2hhciBieXRlKQoreworCXN0YXRpYyBlbnVtIHsKKwkJU1RBVEVfVU5LTk9XTiwKKwkJU1RBVEVfMVBBUkFNLAorCQlTVEFURV8xUEFSQU1fQ09OVElOVUUsCisJCVNUQVRFXzJQQVJBTV8xLAorCQlTVEFURV8yUEFSQU1fMiwKKwkJU1RBVEVfMlBBUkFNXzFfQ09OVElOVUUsCisJCVNUQVRFX1NZU0VYCisJfSBzdGF0ZSA9IFNUQVRFX1VOS05PV047CisJaW50IG5ld2xpbmUgPSAwOworCisJaWYgKGJ5dGUgPj0gMHhmOCkKKwkJbmV3bGluZSA9IDE7CisJZWxzZSBpZiAoYnl0ZSA+PSAweGYwKSB7CisJCW5ld2xpbmUgPSAxOworCQlzd2l0Y2ggKGJ5dGUpIHsKKwkJY2FzZSAweGYwOgorCQkJc3RhdGUgPSBTVEFURV9TWVNFWDsKKwkJCWJyZWFrOworCQljYXNlIDB4ZjE6CisJCWNhc2UgMHhmMzoKKwkJCXN0YXRlID0gU1RBVEVfMVBBUkFNOworCQkJYnJlYWs7CisJCWNhc2UgMHhmMjoKKwkJCXN0YXRlID0gU1RBVEVfMlBBUkFNXzE7CisJCQlicmVhazsKKwkJY2FzZSAweGY0OgorCQljYXNlIDB4ZjU6CisJCWNhc2UgMHhmNjoKKwkJCXN0YXRlID0gU1RBVEVfVU5LTk9XTjsKKwkJCWJyZWFrOworCQljYXNlIDB4Zjc6CisJCQluZXdsaW5lID0gc3RhdGUgIT0gU1RBVEVfU1lTRVg7CisJCQlzdGF0ZSA9IFNUQVRFX1VOS05PV047CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAoYnl0ZSA+PSAweDgwKSB7CisJCW5ld2xpbmUgPSAxOworCQlpZiAoYnl0ZSA+PSAweGMwICYmIGJ5dGUgPD0gMHhkZikKKwkJCXN0YXRlID0gU1RBVEVfMVBBUkFNOworCQllbHNlCisJCQlzdGF0ZSA9IFNUQVRFXzJQQVJBTV8xOworCX0gZWxzZSAvKiBiIDwgMHg4MCAqLyB7CisJCWludCBydW5uaW5nX3N0YXR1cyA9IDA7CisJCW5ld2xpbmUgPSBzdGF0ZSA9PSBTVEFURV9VTktOT1dOOworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgU1RBVEVfMVBBUkFNOgorCQkJc3RhdGUgPSBTVEFURV8xUEFSQU1fQ09OVElOVUU7CisJCQlicmVhazsKKwkJY2FzZSBTVEFURV8xUEFSQU1fQ09OVElOVUU6CisJCQlydW5uaW5nX3N0YXR1cyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBTVEFURV8yUEFSQU1fMToKKwkJCXN0YXRlID0gU1RBVEVfMlBBUkFNXzI7CisJCQlicmVhazsKKwkJY2FzZSBTVEFURV8yUEFSQU1fMjoKKwkJCXN0YXRlID0gU1RBVEVfMlBBUkFNXzFfQ09OVElOVUU7CisJCQlicmVhazsKKwkJY2FzZSBTVEFURV8yUEFSQU1fMV9DT05USU5VRToKKwkJCXJ1bm5pbmdfc3RhdHVzID0gMTsKKwkJCXN0YXRlID0gU1RBVEVfMlBBUkFNXzI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWlmIChydW5uaW5nX3N0YXR1cykKKwkJCWZwdXRzKCJcbiAgIiwgc3Rkb3V0KTsKKwl9CisJcHJpbnRmKCIlYyUwMlgiLCBuZXdsaW5lID8gJ1xuJyA6ICcgJywgYnl0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ19oYW5kbGVyKGludCBkdW1teSkKK3sKKwlzdG9wID0gMTsKK30KKworc3RhdGljIHZvaWQgYWRkX3NlbmRfaGV4X2RhdGEoY29uc3QgY2hhciAqc3RyKQoreworCWludCBsZW5ndGg7CisJY2hhciAqczsKKworCWxlbmd0aCA9IChzZW5kX2hleCA/IHN0cmxlbihzZW5kX2hleCkgKyAxIDogMCkgKyBzdHJsZW4oc3RyKSArIDE7CisJcyA9IG15X21hbGxvYyhsZW5ndGgpOworCWlmIChzZW5kX2hleCkgeworCQlzdHJjcHkocywgc2VuZF9oZXgpOworCQlzdHJjYXQocywgIiAiKTsKKwl9IGVsc2UgeworCQlzWzBdID0gJ1wwJzsKKwl9CisJc3RyY2F0KHMsIHN0cik7CisJZnJlZShzZW5kX2hleCk7CisJc2VuZF9oZXggPSBzOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXN0YXRpYyBjb25zdCBjaGFyIHNob3J0X29wdGlvbnNbXSA9ICJoVmxMcDpzOnI6Uzo6ZHQ6YSI7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJCXsiaGVscCIsIDAsIE5VTEwsICdoJ30sCisJCXsidmVyc2lvbiIsIDAsIE5VTEwsICdWJ30sCisJCXsibGlzdC1kZXZpY2VzIiwgMCwgTlVMTCwgJ2wnfSwKKwkJeyJsaXN0LXJhd21pZGlzIiwgMCwgTlVMTCwgJ0wnfSwKKwkJeyJwb3J0IiwgMSwgTlVMTCwgJ3AnfSwKKwkJeyJzZW5kIiwgMSwgTlVMTCwgJ3MnfSwKKwkJeyJyZWNlaXZlIiwgMSwgTlVMTCwgJ3InfSwKKwkJeyJzZW5kLWhleCIsIDIsIE5VTEwsICdTJ30sCisJCXsiZHVtcCIsIDAsIE5VTEwsICdkJ30sCisJCXsidGltZW91dCIsIDEsIE5VTEwsICd0J30sCisJCXsiYWN0aXZlLXNlbnNpbmciLCAwLCBOVUxMLCAnYSd9LAorCQl7IH0KKwl9OworCWludCBjLCBlcnIsIG9rID0gMDsKKwlpbnQgaWdub3JlX2FjdGl2ZV9zZW5zaW5nID0gMTsKKwlpbnQgZG9fc2VuZF9oZXggPSAwOworCisJd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgc2hvcnRfb3B0aW9ucywKKwkJICAgICAJCWxvbmdfb3B0aW9ucywgTlVMTCkpICE9IC0xKSB7CisJCXN3aXRjaCAoYykgeworCQljYXNlICdoJzoKKwkJCXVzYWdlKCk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSAnVic6CisJCQl2ZXJzaW9uKCk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSAnbCc6CisJCQlkb19kZXZpY2VfbGlzdCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnTCc6CisJCQlkb19yYXdtaWRpX2xpc3QgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJcG9ydF9uYW1lID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJc2VuZF9maWxlX25hbWUgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlyZWNlaXZlX2ZpbGVfbmFtZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdTJzoKKwkJCWRvX3NlbmRfaGV4ID0gMTsKKwkJCWlmIChvcHRhcmcpCisJCQkJYWRkX3NlbmRfaGV4X2RhdGEob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCWR1bXAgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3QnOgorCQkJdGltZW91dCA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdhJzoKKwkJCWlnbm9yZV9hY3RpdmVfc2Vuc2luZyA9IDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVycm9yKCJUcnkgYGFtaWRpIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlpZiAoZG9fc2VuZF9oZXgpIHsKKwkJLyogZGF0YSBmb3IgLVMgY2FuIGJlIHNwZWNpZmllZCBhcyBtdWx0aXBsZSBhcmd1bWVudHMgKi8KKwkJaWYgKCFzZW5kX2hleCAmJiAhYXJndltvcHRpbmRdKSB7CisJCQllcnJvcigiUGxlYXNlIHNwZWNpZnkgc29tZSBkYXRhIGZvciAtLXNlbmQtaGV4LiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZm9yICg7IGFyZ3Zbb3B0aW5kXTsgKytvcHRpbmQpCisJCQlhZGRfc2VuZF9oZXhfZGF0YShhcmd2W29wdGluZF0pOworCX0gZWxzZSB7CisJCWlmIChhcmd2W29wdGluZF0pIHsKKwkJCWVycm9yKCIlcyBpcyBub3QgYW4gb3B0aW9uLiIsIGFyZ3Zbb3B0aW5kXSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCWlmIChkb19yYXdtaWRpX2xpc3QpCisJCXJhd21pZGlfbGlzdCgpOworCWlmIChkb19kZXZpY2VfbGlzdCkKKwkJZGV2aWNlX2xpc3QoKTsKKwlpZiAoZG9fcmF3bWlkaV9saXN0IHx8IGRvX2RldmljZV9saXN0KQorCQlyZXR1cm4gMDsKKworCWlmICghc2VuZF9maWxlX25hbWUgJiYgIXJlY2VpdmVfZmlsZV9uYW1lICYmICFzZW5kX2hleCAmJiAhZHVtcCkgeworCQllcnJvcigiUGxlYXNlIHNwZWNpZnkgYXQgbGVhc3Qgb25lIG9mIC0tc2VuZCwgLS1yZWNlaXZlLCAtLXNlbmQtaGV4LCBvciAtLWR1bXAuIik7CisJCXJldHVybiAxOworCX0KKwlpZiAoc2VuZF9maWxlX25hbWUgJiYgc2VuZF9oZXgpIHsKKwkJZXJyb3IoIi0tc2VuZCBhbmQgLS1zZW5kLWhleCBjYW5ub3QgYmUgc3BlY2lmaWVkIGF0IHRoZSBzYW1lIHRpbWUuIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChzZW5kX2ZpbGVfbmFtZSkKKwkJbG9hZF9maWxlKCk7CisJZWxzZSBpZiAoc2VuZF9oZXgpCisJCXBhcnNlX2RhdGEoKTsKKwlpZiAoKHNlbmRfZmlsZV9uYW1lIHx8IHNlbmRfaGV4KSAmJiAhc2VuZF9kYXRhKQorCQlyZXR1cm4gMTsKKworCWlmIChyZWNlaXZlX2ZpbGVfbmFtZSkgeworCQlyZWNlaXZlX2ZpbGUgPSBjcmVhdChyZWNlaXZlX2ZpbGVfbmFtZSwgMDY2Nik7CisJCWlmIChyZWNlaXZlX2ZpbGUgPT0gLTEpIHsKKwkJCWVycm9yKCJjYW5ub3QgY3JlYXRlICVzOiAlcyIsIHJlY2VpdmVfZmlsZV9uYW1lLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIC0xOworCQl9CisJfSBlbHNlIHsKKwkJcmVjZWl2ZV9maWxlID0gLTE7CisJfQorCisJaWYgKHJlY2VpdmVfZmlsZV9uYW1lIHx8IGR1bXApCisJCWlucHV0cCA9ICZpbnB1dDsKKwllbHNlCisJCWlucHV0cCA9IE5VTEw7CisJaWYgKHNlbmRfZGF0YSkKKwkJb3V0cHV0cCA9ICZvdXRwdXQ7CisJZWxzZQorCQlvdXRwdXRwID0gTlVMTDsKKworCWlmICgoZXJyID0gc25kX3Jhd21pZGlfb3BlbihpbnB1dHAsIG91dHB1dHAsIHBvcnRfbmFtZSwgU05EX1JBV01JRElfTk9OQkxPQ0spKSA8IDApIHsKKwkJZXJyb3IoImNhbm5vdCBvcGVuIHBvcnQgXCIlc1wiOiAlcyIsIHBvcnRfbmFtZSwgc25kX3N0cmVycm9yKGVycikpOworCQlnb3RvIF9leGl0MjsKKwl9CisKKwlpZiAoaW5wdXRwKQorCQlzbmRfcmF3bWlkaV9yZWFkKGlucHV0LCBOVUxMLCAwKTsgLyogdHJpZ2dlciByZWFkaW5nICovCisKKwlpZiAoc2VuZF9kYXRhKSB7CisJCWlmICgoZXJyID0gc25kX3Jhd21pZGlfbm9uYmxvY2sob3V0cHV0LCAwKSkgPCAwKSB7CisJCQllcnJvcigiY2Fubm90IHNldCBibG9ja2luZyBtb2RlOiAlcyIsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJCWdvdG8gX2V4aXQ7CisJCX0KKwkJaWYgKChlcnIgPSBzbmRfcmF3bWlkaV93cml0ZShvdXRwdXQsIHNlbmRfZGF0YSwgc2VuZF9kYXRhX2xlbmd0aCkpIDwgMCkgeworCQkJZXJyb3IoImNhbm5vdCBzZW5kIGRhdGE6ICVzIiwgc25kX3N0cmVycm9yKGVycikpOworCQkJZ290byBfZXhpdDsKKwkJfQorCX0KKworCWlmIChpbnB1dHApIHsKKwkJaW50IHJlYWQgPSAwOworCQlpbnQgbnBmZHMsIHRpbWUgPSAwOworCQlzdHJ1Y3QgcG9sbGZkICpwZmRzOworCisJCXRpbWVvdXQgKj0gMTAwMDsKKwkJbnBmZHMgPSBzbmRfcmF3bWlkaV9wb2xsX2Rlc2NyaXB0b3JzX2NvdW50KGlucHV0KTsKKwkJcGZkcyA9IGFsbG9jYShucGZkcyAqIHNpemVvZihzdHJ1Y3QgcG9sbGZkKSk7CisJCXNuZF9yYXdtaWRpX3BvbGxfZGVzY3JpcHRvcnMoaW5wdXQsIHBmZHMsIG5wZmRzKTsKKwkJc2lnbmFsKFNJR0lOVCwgc2lnX2hhbmRsZXIpOworCQlmb3IgKDs7KSB7CisJCQl1bnNpZ25lZCBjaGFyIGJ1ZlsyNTZdOworCQkJaW50IGksIGxlbmd0aDsKKwkJCXVuc2lnbmVkIHNob3J0IHJldmVudHM7CisKKwkJCWVyciA9IHBvbGwocGZkcywgbnBmZHMsIDIwMCk7CisJCQlpZiAoc3RvcCB8fCAoZXJyIDwgMCAmJiBlcnJubyA9PSBFSU5UUikpCisJCQkJYnJlYWs7CisJCQlpZiAoZXJyIDwgMCkgeworCQkJCWVycm9yKCJwb2xsIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGVyciA9PSAwKSB7CisJCQkJdGltZSArPSAyMDA7CisJCQkJaWYgKHRpbWVvdXQgJiYgdGltZSA+PSB0aW1lb3V0KQorCQkJCQlicmVhazsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICgoZXJyID0gc25kX3Jhd21pZGlfcG9sbF9kZXNjcmlwdG9yc19yZXZlbnRzKGlucHV0LCBwZmRzLCBucGZkcywgJnJldmVudHMpKSA8IDApIHsKKwkJCQllcnJvcigiY2Fubm90IGdldCBwb2xsIGV2ZW50czogJXMiLCBzbmRfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChyZXZlbnRzICYgKFBPTExFUlIgfCBQT0xMSFVQKSkKKwkJCQlicmVhazsKKwkJCWlmICghKHJldmVudHMgJiBQT0xMSU4pKQorCQkJCWNvbnRpbnVlOworCQkJZXJyID0gc25kX3Jhd21pZGlfcmVhZChpbnB1dCwgYnVmLCBzaXplb2YoYnVmKSk7CisJCQlpZiAoZXJyID09IC1FQUdBSU4pCisJCQkJY29udGludWU7CisJCQlpZiAoZXJyIDwgMCkgeworCQkJCWVycm9yKCJjYW5ub3QgcmVhZCBmcm9tIHBvcnQgXCIlc1wiOiAlcyIsIHBvcnRfbmFtZSwgc25kX3N0cmVycm9yKGVycikpOworCQkJCWJyZWFrOworCQkJfQorCQkJbGVuZ3RoID0gMDsKKwkJCWZvciAoaSA9IDA7IGkgPCBlcnI7ICsraSkKKwkJCQlpZiAoIWlnbm9yZV9hY3RpdmVfc2Vuc2luZyB8fCBidWZbaV0gIT0gMHhmZSkKKwkJCQkJYnVmW2xlbmd0aCsrXSA9IGJ1ZltpXTsKKwkJCWlmIChsZW5ndGggPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCXJlYWQgKz0gbGVuZ3RoOworCQkJdGltZSA9IDA7CisJCQlpZiAocmVjZWl2ZV9maWxlICE9IC0xKQorCQkJCXdyaXRlKHJlY2VpdmVfZmlsZSwgYnVmLCBsZW5ndGgpOworCQkJaWYgKGR1bXApIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpCisJCQkJCXByaW50X2J5dGUoYnVmW2ldKTsKKwkJCQlmZmx1c2goc3Rkb3V0KTsKKwkJCX0KKwkJfQorCQlpZiAoaXNhdHR5KGZpbGVubyhzdGRvdXQpKSkKKwkJCXByaW50ZigiXG4lZCBieXRlcyByZWFkXG4iLCByZWFkKTsKKwl9CisKKwlvayA9IDE7CitfZXhpdDoKKwlpZiAoaW5wdXRwKQorCQlzbmRfcmF3bWlkaV9jbG9zZShpbnB1dCk7CisJaWYgKG91dHB1dHApCisJCXNuZF9yYXdtaWRpX2Nsb3NlKG91dHB1dCk7CitfZXhpdDI6CisJaWYgKHJlY2VpdmVfZmlsZSAhPSAtMSkKKwkJY2xvc2UocmVjZWl2ZV9maWxlKTsKKwlyZXR1cm4gIW9rOworfQpkaWZmIC0tZ2l0IGEvYW1peGVyL01ha2VmaWxlLmFtIGIvYW1peGVyL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZDBlODEKLS0tIC9kZXYvbnVsbAorKysgYi9hbWl4ZXIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMCBAQAorSU5DTFVERVMgPSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorTERBREQgPSAtbG0KKyMgTERGTEFHUyA9IC1zdGF0aWMKKyMgQ0ZMQUdTICs9IC1nIC1XYWxsCisKK2Jpbl9QUk9HUkFNUyA9IGFtaXhlcgorYW1peGVyX1NPVVJDRVMgPSBhbWl4ZXIuYworbm9pbnN0X0hFQURFUlMgPSBhbWl4ZXIuaAorbWFuX01BTlMgPSBhbWl4ZXIuMQorRVhUUkFfRElTVCA9IGFtaXhlci4xCmRpZmYgLS1naXQgYS9hbWl4ZXIvYW1peGVyLjEgYi9hbWl4ZXIvYW1peGVyLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFhYzMyMwotLS0gL2Rldi9udWxsCisrKyBiL2FtaXhlci9hbWl4ZXIuMQpAQCAtMCwwICsxLDE0MSBAQAorLlRIIEFNSVhFUiAxICIxMSBBdWcgMjAwMCIKKy5TSCBOQU1FCithbWl4ZXIgXC0gY29tbWFuZC1saW5lIG1peGVyIGZvciBBTFNBIHNvdW5kY2FyZCBkcml2ZXIKKy5TSCBTWU5PUFNJUworXGZCYW1peGVyXGZQIFtcZklcLW9wdGlvblxmUF0gW1xmSWNtZFxmUF0KKy5TSCBERVNDUklQVElPTgorXGZCYW1peGVyXGZQIGFsbG93cyBjb21tYW5kLWxpbmUgY29udHJvbCBvZiB0aGUgbWl4ZXIgZm9yIHRoZSBBTFNBCitzb3VuZGNhcmQgZHJpdmVyLgorXGZCYW1peGVyXGZQIHN1cHBvcnRzIG11bHRpcGxlIHNvdW5kY2FyZHMuCisKK1xmQmFtaXhlclxmUiB3aXRoIG5vIGFyZ3VtZW50cyB3aWxsIGRpc3BsYXkgdGhlIGN1cnJlbnQgbWl4ZXIgc2V0dGluZ3MKK2ZvciB0aGUgZGVmYXVsdCBzb3VuZGNhcmQgYW5kIGRldmljZS4gVGhpcyBpcyBhIGdvb2Qgd2F5IHRvIHNlZSBhIGxpc3QKK29mIHRoZSBzaW1wbGUgbWl4ZXIgY29udHJvbHMgeW91IGNhbiB1c2UuCisKKy5TSCBDT01NQU5EUworCisuVFAKK1xmSWhlbHBcZlAKK1Nob3dzIHN5bnRheC4KKworLlRQCitcZklpbmZvXGZQCitTaG93cyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgYSBtaXhlciBkZXZpY2UuCisKKy5UUAorXGZJc2NvbnRyb2xzXGZQCitTaG93cyBhIGNvbXBsZXRlIGxpc3Qgb2Ygc2ltcGxlIG1peGVyIGNvbnRyb2xzLgorCisuVFAKK1xmSXNjb250ZW50c1xmUAorU2hvd3MgYSBjb21wbGV0ZSBsaXN0IG9mIHNpbXBsZSBtaXhlciBjb250cm9scyB3aXRoIHRoZWlyIGNvbnRlbnRzLgorCisuVFAKK1xmSXNldFxmUCBvciBcZklzc2V0XGZQIDxcZklTQ09OVFJPTFxmUD4gPFxmSVBBUkFNRVRFUlxmUD4gLi4uCitTZXRzIHRoZSBzaW1wbGUgbWl4ZXIgY29udHJvbCBjb250ZW50cy4gVGhlIHBhcmFtZXRlciBjYW4gYmUgdGhlIHZvbHVtZQorZWl0aGVyIGFzIGEgcGVyY2VudGFnZSBmcm9tIDAlIHRvIDEwMCUgd2l0aCBcZkklXGZQIHN1ZmZpeCwKK2EgZEIgZ2FpbiB3aXRoIFxmSWRCXGZQIHN1ZmZpeCAobGlrZSAtMTIuNWRCKSwgb3IgYW4gZXhhY3QgaGFyZHdhcmUgdmFsdWUuCitUaGUgZEIgZ2FpbiBjYW4gYmUgdXNlZCBvbmx5IGZvciB0aGUgbWl4ZXIgZWxlbWVudHMgd2l0aCBhdmFpbGFibGUKK2RCIGluZm9ybWF0aW9uLgorV2hlbiBwbHVzKCspIG9yIG1pbnVzKFwtKSBsZXR0ZXIgaXMgYXBwZW5kZWQgYWZ0ZXIKK3ZvbHVtZSB2YWx1ZSwgdGhlIHZvbHVtZSBpcyBpbmNyZW1lbnRlZCBvciBkZWNyZW1lbnRlZCBmcm9tIHRoZSBjdXJyZW50Cit2YWx1ZSwgcmVzcGVjdGl2ZWx5LgorCitUaGUgcGFyYW1ldGVycyBcZkljYXAsIG5vY2FwLCBtdXRlLCB1bm11dGUsIHRvZ2dsZVxmUCBhcmUgdXNlZCB0bworY2hhbmdlIGNhcHR1cmUgKHJlY29yZGluZykgYW5kIG11dGluZyBmb3IgdGhlIGdyb3VwIHNwZWNpZmllZC4KKworVGhlIG9wdGlvbmFsIG1vZGlmaWVycyBjYW4gYmUgcHV0IGFzIGV4dHJhIHBhcmFtZXRlcnMgdG8gc3BlY2lmeQordGhlIHN0cmVhbSBkaXJlY3Rpb24gb3IgY2hhbm5lbHMgdG8gYXBwbHkuCitUaGUgbW9kaWZpZXJzIFxmSXBsYXliYWNrXGZQIGFuZCBcZkljYXB0dXJlXGZQIHNwZWNpZnkgdGhlIHN0cmVhbSwKK2FuZCB0aGUgbW9kaWZpZXJzIFxmSWZyb250LCByZWFyLCBjZW50ZXIsIHdvb2ZlclxmUCBhcmUgdXNlZCB0byBzcGVjaWZ5CitjaGFubmVscyB0byBiZSBjaGFuZ2VkLiAKKworQSBzaW1wbGUgbWl4ZXIgY29udHJvbCBtdXN0IGJlIHNwZWNpZmllZC4gT25seSBvbmUgZGV2aWNlIGNhbiBiZSBjb250cm9sbGVkCithdCBhIHRpbWUuCisKKy5UUAorXGZJZ2V0XGZQIG9yIFxmSXNnZXRcZlAgPFxmSVNDT05UUk9MXGZQPgorU2hvd3MgdGhlIHNpbXBsZSBtaXhlciBjb250cm9sIGNvbnRlbnRzLgorCitBIHNpbXBsZSBtaXhlciBjb250cm9sIG11c3QgYmUgc3BlY2lmaWVkLiBPbmx5IG9uZSBkZXZpY2UgY2FuIGJlIGNvbnRyb2xsZWQKK2F0IGEgdGltZS4KKworLlRQCitcZkljb250cm9sc1xmUAorU2hvd3MgYSBjb21wbGV0ZSBsaXN0IG9mIGNhcmQgY29udHJvbHMuCisKKy5UUAorXGZJY29udGVudHNcZlAKK1Nob3dzIGEgY29tcGxldGUgbGlzdCBvZiBjYXJkIGNvbnRyb2xzIHdpdGggdGhlaXIgY29udGVudHMuCisKKy5UUAorXGZJY3NldFxmUCA8XGZJQ09OVFJPTFxmUD4gPFxmSVBBUkFNRVRFUlxmUD4gLi4uCitTZXRzIHRoZSBjYXJkIGNvbnRyb2wgY29udGVudHMuIFRoZSBpZGVudGlmaWVyIGhhcyB0aGVzZSBjb21wb25lbnRzOiBpZmFjZSwKK25hbWUsIGluZGV4LCBkZXZpY2UsIHN1YmRldmljZSwgbnVtaWQuIFRoZSBuZXh0IGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgdmFsdWUKK29mIGNvbnRyb2wuCisKKy5UUAorXGZJY2dldFxmUCA8XGZJQ09OVFJPTFxmUD4KK1Nob3dzIHRoZSBjYXJkIGNvbnRyb2wgY29udGVudHMuIFRoZSBpZGVudGlmaWVyIGhhcyBzYW1lIHN5bnRheCBhcyBmb3IKK3RoZSBcZkljc2V0XGZQIGNvbW1hbmQuCisKKy5TSCBPUFRJT05TCisKKy5UUAorXGZJXC1jXGZQIGNhcmQKKworU2VsZWN0IHRoZSBjYXJkIG51bWJlciB0byBjb250cm9sLiBUaGUgZGV2aWNlIG5hbWUgY3JlYXRlZCBmcm9tIHRoaXMKK3BhcmFtZXRlciBoYXMgc3ludGF4ICdodzpOJyB3aGVyZSBOIGlzIHNwZWNpZmllZCBjYXJkIG51bWJlci4KKworLlRQCitcZklcLURcZlAgZGV2aWNlCisKK1NlbGVjdCB0aGUgZGV2aWNlIG5hbWUgdG8gY29udHJvbC4gVGhlIGRlZmF1bHQgY29udHJvbCBuYW1lIGlzICdkZWZhdWx0Jy4KKworLlRQCitcZklcLXNcZlAgfCBcZklcLVwtc3RkaW5cZlAKKworUmVhZCBmcm9tIHN0ZGluIGFuZCBleGVjdXRlIHRoZSBjb21tYW5kIG9uIGVhY2ggbGluZSBzZXF1ZW50aWFsbHkuCitXaGVuIHRoaXMgb3B0aW9uIGlzIGdpdmVuLCB0aGUgY29tbWFuZCBpbiBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGlzIGlnbm9yZWQuCisKK09ubHkgc3NldCBhbmQgY3NldCBhcmUgYWNjZXB0ZWQuICBPdGhlciBjb21tYW5kcyBhcmUgaWdub3JlZC4KK1RoZSBjb21tYW5kcyB0byB1bm1hdGNoZWQgaWRzIGFyZSBpZ25vcmVkIHdpdGhvdXQgZXJyb3JzIHRvby4KKworLlRQCitcZklcLWhcZlAgCitIZWxwOiBzaG93IHN5bnRheC4KKy5UUAorXGZJXC1xXGZQCitRdWlldCBtb2RlLiBEbyBub3Qgc2hvdyByZXN1bHRzIG9mIGNoYW5nZXMuCisKKy5TSCBFWEFNUExFUworCisuVFAKK1xmQmFtaXhlciBcLWMgMSBzc2V0IExpbmUsMCA4MCUsNDAlIHVubXV0ZSBjYXBcZlIKK3dpbGwgc2V0IHRoZSBzZWNvbmQgc291bmRjYXJkJ3MgbGVmdCBsaW5lIGlucHV0IHZvbHVtZSB0byA4MCUgYW5kCityaWdodCBsaW5lIGlucHV0IHRvIDQwJSwgdW5tdXRlIGl0LCBhbmQgc2VsZWN0IGl0IGFzIGEgc291cmNlIGZvcgorY2FwdHVyZSAocmVjb3JkaW5nKS5cZlIKKworLlRQCitcZkJhbWl4ZXIgXC1jIDEgXC1cLSBzc2V0IE1hc3RlciBwbGF5YmFjayAtMjBkQlxmUgord2lsbCBzZXQgdGhlIG1hc3RlciB2b2x1bWUgb2YgdGhlIHNlY29uZCBjYXJkIHRvIC0yMGRCLiAgSWYgdGhlIG1hc3RlcgoraGFzIG11bHRpcGxlIGNoYW5uZWxzLCBhbGwgY2hhbm5lbHMgYXJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZS4KKworLlRQCitcZkJhbWl4ZXIgXC1jIDEgc2V0IFBDTSAyZEIrXGZSCit3aWxsIGluY3JlYXNlIHRoZSBQQ00gdm9sdW1lIG9mIHRoZSBzZWNvbmQgY2FyZCB3aXRoIDJkQi4gIFdoZW4gYm90aAorcGxheWJhY2sgYW5kIGNhcHR1cmUgdm9sdW1lcyBleGlzdCwgdGhpcyBpcyBhcHBsaWVkIHRvIGJvdGggdm9sdW1lcy4KKworLlRQCitcZkJhbWl4ZXIgXC1jIDIgY3NldCBpZmFjZT1NSVhFUixuYW1lPSdMaW5lIFBsYXliYWNrIFZvbHVtZSIsaW5kZXg9MSA0MCVcZlIKK3dpbGwgc2V0IHRoZSB0aGlyZCBzb3VuZGNhcmQncyBzZWNvbmQgbGluZSBwbGF5YmFjayB2b2x1bWUocykgdG8gNDAlCisKKy5UUAorXGZCYW1peGVyIFwtYyAyIGNzZXQgbnVtaWQ9MzQgNDAlXGZSCit3aWxsIHNldCB0aGUgMzR0aCBzb3VuZGNhcmQgZWxlbWVudCB0byA0MCUKKworLlNIIEJVR1MgCitOb25lIGtub3duLgorLlNIIEFVVEhPUgorXGZCYW1peGVyXGZQIGlzIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+LgorVGhpcyBkb2N1bWVudCBpcyBieSBQYXVsIFdpbmtsZXIgPHphcm16YXJtQGVyb2xzLmNvbT4gYW5kIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+LgpkaWZmIC0tZ2l0IGEvYW1peGVyL2FtaXhlci5jIGIvYW1peGVyL2FtaXhlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMjg1NWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbWl4ZXIvYW1peGVyLmMKQEAgLTAsMCArMSwyMDM2IEBACisvKgorICogICBBTFNBIGNvbW1hbmQgbGluZSBtaXhlciB1dGlsaXR5CisgKiAgIENvcHlyaWdodCAoYykgMTk5OS0yMDAwIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGFsc2EvYXNvdW5kbGliLmg+CisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNpbmNsdWRlICJhbWl4ZXIuaCIKKworI2RlZmluZSBMRVZFTF9CQVNJQwkJKDE8PDApCisjZGVmaW5lIExFVkVMX0lOQUNUSVZFCQkoMTw8MSkKKyNkZWZpbmUgTEVWRUxfSUQJCSgxPDwyKQorCitzdGF0aWMgaW50IHF1aWV0ID0gMDsKK3N0YXRpYyBpbnQgZGVidWdmbGFnID0gMDsKK3N0YXRpYyBpbnQgbm9fY2hlY2sgPSAwOworc3RhdGljIGludCBzbWl4ZXJfbGV2ZWwgPSAwOworc3RhdGljIGludCBpZ25vcmVfZXJyb3IgPSAwOworc3RhdGljIHN0cnVjdCBzbmRfbWl4ZXJfc2VsZW1fcmVnb3B0IHNtaXhlcl9vcHRpb25zOworc3RhdGljIGNoYXIgY2FyZFs2NF0gPSAiZGVmYXVsdCI7CisKK3N0YXRpYyB2b2lkIGVycm9yKGNvbnN0IGNoYXIgKmZtdCwuLi4pCit7CisJdmFfbGlzdCB2YTsKKworCXZhX3N0YXJ0KHZhLCBmbXQpOworCWZwcmludGYoc3RkZXJyLCAiYW1peGVyOiAiKTsKKwl2ZnByaW50ZihzdGRlcnIsIGZtdCwgdmEpOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwl2YV9lbmQodmEpOworfQorCitzdGF0aWMgaW50IGhlbHAodm9pZCkKK3sKKwlwcmludGYoIlVzYWdlOiBhbWl4ZXIgPG9wdGlvbnM+IFtjb21tYW5kXVxuIik7CisJcHJpbnRmKCJcbkF2YWlsYWJsZSBvcHRpb25zOlxuIik7CisJcHJpbnRmKCIgIC1oLC0taGVscCAgICAgICB0aGlzIGhlbHBcbiIpOworCXByaW50ZigiICAtYywtLWNhcmQgTiAgICAgc2VsZWN0IHRoZSBjYXJkXG4iKTsKKwlwcmludGYoIiAgLUQsLS1kZXZpY2UgTiAgIHNlbGVjdCB0aGUgZGV2aWNlLCBkZWZhdWx0ICclcydcbiIsIGNhcmQpOworCXByaW50ZigiICAtZCwtLWRlYnVnICAgICAgZGVidWcgbW9kZVxuIik7CisJcHJpbnRmKCIgIC1uLC0tbm9jaGVjayAgICBkbyBub3QgcGVyZm9ybSByYW5nZSBjaGVja2luZ1xuIik7CisJcHJpbnRmKCIgIC12LC0tdmVyc2lvbiAgICBwcmludCB2ZXJzaW9uIG9mIHRoaXMgcHJvZ3JhbVxuIik7CisJcHJpbnRmKCIgIC1xLC0tcXVpZXQgICAgICBiZSBxdWlldFxuIik7CisJcHJpbnRmKCIgIC1pLC0taW5hY3RpdmUgICBzaG93IGFsc28gaW5hY3RpdmUgY29udHJvbHNcbiIpOworCXByaW50ZigiICAtYSwtLWFic3RyYWN0IEwgc2VsZWN0IGFic3RyYWN0aW9uIGxldmVsIChub25lIG9yIGJhc2ljKVxuIik7CisJcHJpbnRmKCIgIC1zLC0tc3RkaW4gICAgICBSZWFkIGFuZCBleGVjdXRlIGNvbW1hbmRzIGZyb20gc3RkaW4gc2VxdWVudGlhbGx5XG4iKTsKKwlwcmludGYoIlxuQXZhaWxhYmxlIGNvbW1hbmRzOlxuIik7CisJcHJpbnRmKCIgIHNjb250cm9scyAgICAgICBzaG93IGFsbCBtaXhlciBzaW1wbGUgY29udHJvbHNcbiIpOworCXByaW50ZigiICBzY29udGVudHMJICBzaG93IGNvbnRlbnRzIG9mIGFsbCBtaXhlciBzaW1wbGUgY29udHJvbHMgKGRlZmF1bHQgY29tbWFuZClcbiIpOworCXByaW50ZigiICBzc2V0IHNJRCBQICAgICAgc2V0IGNvbnRlbnRzIGZvciBvbmUgbWl4ZXIgc2ltcGxlIGNvbnRyb2xcbiIpOworCXByaW50ZigiICBzZ2V0IHNJRCAgICAgICAgZ2V0IGNvbnRlbnRzIGZvciBvbmUgbWl4ZXIgc2ltcGxlIGNvbnRyb2xcbiIpOworCXByaW50ZigiICBjb250cm9scyAgICAgICAgc2hvdyBhbGwgY29udHJvbHMgZm9yIGdpdmVuIGNhcmRcbiIpOworCXByaW50ZigiICBjb250ZW50cyAgICAgICAgc2hvdyBjb250ZW50cyBvZiBhbGwgY29udHJvbHMgZm9yIGdpdmVuIGNhcmRcbiIpOworCXByaW50ZigiICBjc2V0IGNJRCBQICAgICAgc2V0IGNvbnRyb2wgY29udGVudHMgZm9yIG9uZSBjb250cm9sXG4iKTsKKwlwcmludGYoIiAgY2dldCBjSUQgICAgICAgIGdldCBjb250cm9sIGNvbnRlbnRzIGZvciBvbmUgY29udHJvbFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5mbyh2b2lkKQoreworCWludCBlcnI7CisJc25kX2N0bF90ICpoYW5kbGU7CisJc25kX21peGVyX3QgKm1oYW5kbGU7CisJc25kX2N0bF9jYXJkX2luZm9fdCAqaW5mbzsKKwlzbmRfY3RsX2VsZW1fbGlzdF90ICpjbGlzdDsKKwlzbmRfY3RsX2NhcmRfaW5mb19hbGxvY2EoJmluZm8pOworCXNuZF9jdGxfZWxlbV9saXN0X2FsbG9jYSgmY2xpc3QpOworCQorCWlmICgoZXJyID0gc25kX2N0bF9vcGVuKCZoYW5kbGUsIGNhcmQsIDApKSA8IDApIHsKKwkJZXJyb3IoIkNvbnRyb2wgZGV2aWNlICVzIG9wZW4gZXJyb3I6ICVzIiwgY2FyZCwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gZXJyOworCX0KKwkKKwlpZiAoKGVyciA9IHNuZF9jdGxfY2FyZF9pbmZvKGhhbmRsZSwgaW5mbykpIDwgMCkgeworCQllcnJvcigiQ29udHJvbCBkZXZpY2UgJXMgaHcgaW5mbyBlcnJvcjogJXMiLCBjYXJkLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybiBlcnI7CisJfQorCXByaW50ZigiQ2FyZCAlcyAnJXMnLyclcydcbiIsIGNhcmQsIHNuZF9jdGxfY2FyZF9pbmZvX2dldF9pZChpbmZvKSwKKwkgICAgICAgc25kX2N0bF9jYXJkX2luZm9fZ2V0X2xvbmduYW1lKGluZm8pKTsKKwlwcmludGYoIiAgTWl4ZXIgbmFtZQk6ICclcydcbiIsIHNuZF9jdGxfY2FyZF9pbmZvX2dldF9taXhlcm5hbWUoaW5mbykpOworCXByaW50ZigiICBDb21wb25lbnRzCTogJyVzJ1xuIiwgc25kX2N0bF9jYXJkX2luZm9fZ2V0X2NvbXBvbmVudHMoaW5mbykpOworCWlmICgoZXJyID0gc25kX2N0bF9lbGVtX2xpc3QoaGFuZGxlLCBjbGlzdCkpIDwgMCkgeworCQllcnJvcigic25kX2N0bF9lbGVtX2xpc3QgZmFpbHVyZTogJXMiLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCIgIENvbnRyb2xzICAgICAgOiAlaVxuIiwgc25kX2N0bF9lbGVtX2xpc3RfZ2V0X2NvdW50KGNsaXN0KSk7CisJfQorCXNuZF9jdGxfY2xvc2UoaGFuZGxlKTsKKwlpZiAoKGVyciA9IHNuZF9taXhlcl9vcGVuKCZtaGFuZGxlLCAwKSkgPCAwKSB7CisJCWVycm9yKCJNaXhlciBvcGVuIGVycm9yOiAlcyIsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKHNtaXhlcl9sZXZlbCA9PSAwICYmIChlcnIgPSBzbmRfbWl4ZXJfYXR0YWNoKG1oYW5kbGUsIGNhcmQpKSA8IDApIHsKKwkJZXJyb3IoIk1peGVyIGF0dGFjaCAlcyBlcnJvcjogJXMiLCBjYXJkLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCXNuZF9taXhlcl9jbG9zZShtaGFuZGxlKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKChlcnIgPSBzbmRfbWl4ZXJfc2VsZW1fcmVnaXN0ZXIobWhhbmRsZSwgc21peGVyX2xldmVsID4gMCA/ICZzbWl4ZXJfb3B0aW9ucyA6IE5VTEwsIE5VTEwpKSA8IDApIHsKKwkJZXJyb3IoIk1peGVyIHJlZ2lzdGVyIGVycm9yOiAlcyIsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJc25kX21peGVyX2Nsb3NlKG1oYW5kbGUpOworCQlyZXR1cm4gZXJyOworCX0KKwllcnIgPSBzbmRfbWl4ZXJfbG9hZChtaGFuZGxlKTsKKwlpZiAoZXJyIDwgMCkgeworCQllcnJvcigiTWl4ZXIgbG9hZCAlcyBlcnJvcjogJXMiLCBjYXJkLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCXNuZF9taXhlcl9jbG9zZShtaGFuZGxlKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJcHJpbnRmKCIgIFNpbXBsZSBjdHJscyAgOiAlaVxuIiwgc25kX21peGVyX2dldF9jb3VudChtaGFuZGxlKSk7CisJc25kX21peGVyX2Nsb3NlKG1oYW5kbGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqY29udHJvbF9pZmFjZShzbmRfY3RsX2VsZW1faWRfdCAqaWQpCit7CisJcmV0dXJuIHNuZF9jdGxfZWxlbV9pZmFjZV9uYW1lKHNuZF9jdGxfZWxlbV9pZF9nZXRfaW50ZXJmYWNlKGlkKSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb250cm9sX3R5cGUoc25kX2N0bF9lbGVtX2luZm9fdCAqaW5mbykKK3sKKwlyZXR1cm4gc25kX2N0bF9lbGVtX3R5cGVfbmFtZShzbmRfY3RsX2VsZW1faW5mb19nZXRfdHlwZShpbmZvKSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb250cm9sX2FjY2VzcyhzbmRfY3RsX2VsZW1faW5mb190ICppbmZvKQoreworCXN0YXRpYyBjaGFyIHJlc3VsdFsxMF07CisJY2hhciAqcmVzID0gcmVzdWx0OworCisJKnJlcysrID0gc25kX2N0bF9lbGVtX2luZm9faXNfcmVhZGFibGUoaW5mbykgPyAncicgOiAnLSc7CisJKnJlcysrID0gc25kX2N0bF9lbGVtX2luZm9faXNfd3JpdGFibGUoaW5mbykgPyAndycgOiAnLSc7CisJKnJlcysrID0gc25kX2N0bF9lbGVtX2luZm9faXNfaW5hY3RpdmUoaW5mbykgPyAnaScgOiAnLSc7CisJKnJlcysrID0gc25kX2N0bF9lbGVtX2luZm9faXNfdm9sYXRpbGUoaW5mbykgPyAndicgOiAnLSc7CisJKnJlcysrID0gc25kX2N0bF9lbGVtX2luZm9faXNfbG9ja2VkKGluZm8pID8gJ2wnIDogJy0nOworCSpyZXMrKyA9IHNuZF9jdGxfZWxlbV9pbmZvX2lzX3Rsdl9yZWFkYWJsZShpbmZvKSA/ICdSJyA6ICctJzsKKwkqcmVzKysgPSBzbmRfY3RsX2VsZW1faW5mb19pc190bHZfd3JpdGFibGUoaW5mbykgPyAnVycgOiAnLSc7CisJKnJlcysrID0gc25kX2N0bF9lbGVtX2luZm9faXNfdGx2X2NvbW1hbmRhYmxlKGluZm8pID8gJ0MnIDogJy0nOworCSpyZXMrKyA9ICdcMCc7CisJcmV0dXJuIHJlc3VsdDsKK30KKworI2RlZmluZSBjaGVja19yYW5nZSh2YWwsIG1pbiwgbWF4KSBcCisJKG5vX2NoZWNrID8gKHZhbCkgOiAoKHZhbCA8IG1pbikgPyAobWluKSA6ICh2YWwgPiBtYXgpID8gKG1heCkgOiAodmFsKSkpIAorI2lmIDAKK3N0YXRpYyBpbnQgY29udmVydF9yYW5nZShpbnQgdmFsLCBpbnQgb21pbiwgaW50IG9tYXgsIGludCBubWluLCBpbnQgbm1heCkKK3sKKwlpbnQgb3JhbmdlID0gb21heCAtIG9taW4sIG5yYW5nZSA9IG5tYXggLSBubWluOworCQorCWlmIChvcmFuZ2UgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHJpbnQoKCgoZG91YmxlKW5yYW5nZSAqICgoZG91YmxlKXZhbCAtIChkb3VibGUpb21pbikpICsgKChkb3VibGUpb3JhbmdlIC8gMi4wKSkgLyAoKGRvdWJsZSlvcmFuZ2UgKyAoZG91YmxlKW5taW4pKTsKK30KKyNlbmRpZgorCisjaWYgMAorc3RhdGljIGludCBjb252ZXJ0X2RiX3JhbmdlKGludCB2YWwsIGludCBvbWluLCBpbnQgb21heCwgaW50IG5taW4sIGludCBubWF4KQoreworCWludCBvcmFuZ2UgPSBvbWF4IC0gb21pbiwgbnJhbmdlID0gbm1heCAtIG5taW47CisJCisJaWYgKG9yYW5nZSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gcmludCgoKChkb3VibGUpbnJhbmdlICogKChkb3VibGUpdmFsIC0gKGRvdWJsZSlvbWluKSkgKyAoKGRvdWJsZSlvcmFuZ2UgLyAyLjApKSAvIChkb3VibGUpb3JhbmdlICsgKGRvdWJsZSlubWluKTsKK30KKyNlbmRpZgorCisvKiBGdWN0aW9uIHRvIGNvbnZlcnQgZnJvbSB2b2x1bWUgdG8gcGVyY2VudGFnZS4gdmFsID0gdm9sdW1lICovCisKK3N0YXRpYyBpbnQgY29udmVydF9wcmFuZ2UoaW50IHZhbCwgaW50IG1pbiwgaW50IG1heCkKK3sKKwlpbnQgcmFuZ2UgPSBtYXggLSBtaW47CisJaW50IHRtcDsKKworCWlmIChyYW5nZSA9PSAwKQorCQlyZXR1cm4gMDsKKwl2YWwgLT0gbWluOworCXRtcCA9IHJpbnQoKGRvdWJsZSl2YWwvKGRvdWJsZSlyYW5nZSAqIDEwMCk7CisJcmV0dXJuIHRtcDsKK30KKworLyogRnVuY3Rpb24gdG8gY29udmVydCBmcm9tIHBlcmNlbnRhZ2UgdG8gdm9sdW1lLiB2YWwgPSBwZXJjZW50YWdlICovCisKKyNkZWZpbmUgY29udmVydF9wcmFuZ2UxKHZhbCwgbWluLCBtYXgpIFwKKwljZWlsKCh2YWwpICogKChtYXgpIC0gKG1pbikpICogMC4wMSArIChtaW4pKQorCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X3BlcmNlbnQoaW50IHZhbCwgaW50IG1pbiwgaW50IG1heCkKK3sKKwlzdGF0aWMgY2hhciBzdHJbMzJdOworCWludCBwOworCQorCXAgPSBjb252ZXJ0X3ByYW5nZSh2YWwsIG1pbiwgbWF4KTsKKwlzcHJpbnRmKHN0ciwgIiVpIFslaSUlXSIsIHZhbCwgcCk7CisJcmV0dXJuIHN0cjsKK30KKworI2lmIDAKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfcGVyY2VudDEoaW50IHZhbCwgaW50IG1pbiwgaW50IG1heCwgaW50IG1pbl9kQiwgaW50IG1heF9kQikKK3sKKwlzdGF0aWMgY2hhciBzdHJbMzJdOworCWludCBwLCBkYjsKKworCXAgPSBjb252ZXJ0X3ByYW5nZSh2YWwsIG1pbiwgbWF4KTsKKwlkYiA9IGNvbnZlcnRfZGJfcmFuZ2UodmFsLCBtaW4sIG1heCwgbWluX2RCLCBtYXhfZEIpOworCXNwcmludGYoc3RyLCAiJWkgWyVpJSVdIFslaS4lMDJpZEJdIiwgdmFsLCBwLCBkYiAvIDEwMCwgYWJzKGRiICUgMTAwKSk7CisJcmV0dXJuIHN0cjsKK30KKyNlbmRpZgorCitzdGF0aWMgbG9uZyBnZXRfaW50ZWdlcihjaGFyICoqcHRyLCBsb25nIG1pbiwgbG9uZyBtYXgpCit7CisJbG9uZyB2YWwgPSBtaW47CisJY2hhciAqcCA9ICpwdHIsICpzOworCisJaWYgKCpwID09ICc6JykKKwkJcCsrOworCWlmICgqcCA9PSAnXDAnIHx8ICghaXNkaWdpdCgqcCkgJiYgKnAgIT0gJy0nKSkKKwkJZ290byBvdXQ7CisKKwlzID0gcDsKKwl2YWwgPSBzdHJ0b2wocywgJnAsIDEwKTsKKwlpZiAoKnAgPT0gJy4nKSB7CisJCXArKzsKKwkJc3RydG9sKHAsICZwLCAxMCk7CisJfQorCWlmICgqcCA9PSAnJScpIHsKKwkJdmFsID0gKGxvbmcpY29udmVydF9wcmFuZ2UxKHN0cnRvZChzLCBOVUxMKSwgbWluLCBtYXgpOworCQlwKys7CisJfQorCXZhbCA9IGNoZWNrX3JhbmdlKHZhbCwgbWluLCBtYXgpOworCWlmICgqcCA9PSAnLCcpCisJCXArKzsKKyBvdXQ6CisJKnB0ciA9IHA7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGxvbmcgZ2V0X2ludGVnZXI2NChjaGFyICoqcHRyLCBsb25nIGxvbmcgbWluLCBsb25nIGxvbmcgbWF4KQoreworCWxvbmcgbG9uZyB2YWwgPSBtaW47CisJY2hhciAqcCA9ICpwdHIsICpzOworCisJaWYgKCpwID09ICc6JykKKwkJcCsrOworCWlmICgqcCA9PSAnXDAnIHx8ICghaXNkaWdpdCgqcCkgJiYgKnAgIT0gJy0nKSkKKwkJZ290byBvdXQ7CisKKwlzID0gcDsKKwl2YWwgPSBzdHJ0b2wocywgJnAsIDEwKTsKKwlpZiAoKnAgPT0gJy4nKSB7CisJCXArKzsKKwkJc3RydG9sKHAsICZwLCAxMCk7CisJfQorCWlmICgqcCA9PSAnJScpIHsKKwkJdmFsID0gKGxvbmcgbG9uZyljb252ZXJ0X3ByYW5nZTEoc3RydG9kKHMsIE5VTEwpLCBtaW4sIG1heCk7CisJCXArKzsKKwl9CisJdmFsID0gY2hlY2tfcmFuZ2UodmFsLCBtaW4sIG1heCk7CisJaWYgKCpwID09ICcsJykKKwkJcCsrOworIG91dDoKKwkqcHRyID0gcDsKKwlyZXR1cm4gdmFsOworfQorCitzdHJ1Y3Qgdm9sdW1lX29wcyB7CisJaW50ICgqZ2V0X3JhbmdlKShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBsb25nICptaW4sIGxvbmcgKm1heCk7CisJaW50ICgqZ2V0KShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGMsCisJCSAgIGxvbmcgKnZhbHVlKTsKKwlpbnQgKCpzZXQpKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgYywKKwkJICAgbG9uZyB2YWx1ZSk7Cit9OworCQorZW51bSB7IFZPTF9SQVcsIFZPTF9EQiB9OworCitzdHJ1Y3Qgdm9sdW1lX29wc19zZXQgeworCWludCAoKmhhc192b2x1bWUpKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOworCXN0cnVjdCB2b2x1bWVfb3BzIHZbMl07Cit9OworCitzdGF0aWMgaW50IHNldF9wbGF5YmFja19kQihzbmRfbWl4ZXJfZWxlbV90ICplbGVtLAorCQkJICAgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjLCBsb25nIHZhbHVlKQoreworCXJldHVybiBzbmRfbWl4ZXJfc2VsZW1fc2V0X3BsYXliYWNrX2RCKGVsZW0sIGMsIHZhbHVlLCAwKTsKK30KKworc3RhdGljIGludCBzZXRfY2FwdHVyZV9kQihzbmRfbWl4ZXJfZWxlbV90ICplbGVtLAorCQkJICBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGMsIGxvbmcgdmFsdWUpCit7CisJcmV0dXJuIHNuZF9taXhlcl9zZWxlbV9zZXRfY2FwdHVyZV9kQihlbGVtLCBjLCB2YWx1ZSwgMCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm9sdW1lX29wc19zZXQgdm9sX29wc1syXSA9IHsKKwl7CisJCS5oYXNfdm9sdW1lID0gc25kX21peGVyX3NlbGVtX2hhc19wbGF5YmFja192b2x1bWUsCisJCS52ID0ge3sgc25kX21peGVyX3NlbGVtX2dldF9wbGF5YmFja192b2x1bWVfcmFuZ2UsCisJCQlzbmRfbWl4ZXJfc2VsZW1fZ2V0X3BsYXliYWNrX3ZvbHVtZSwKKwkJCXNuZF9taXhlcl9zZWxlbV9zZXRfcGxheWJhY2tfdm9sdW1lIH0sCisJCSAgICAgIHsgc25kX21peGVyX3NlbGVtX2dldF9wbGF5YmFja19kQl9yYW5nZSwKKwkJCXNuZF9taXhlcl9zZWxlbV9nZXRfcGxheWJhY2tfZEIsCisJCQlzZXRfcGxheWJhY2tfZEIgfX0sCisJfSwKKwl7CisJCS5oYXNfdm9sdW1lID0gc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3ZvbHVtZSwKKwkJLnYgPSB7eyBzbmRfbWl4ZXJfc2VsZW1fZ2V0X2NhcHR1cmVfdm9sdW1lX3JhbmdlLAorCQkJc25kX21peGVyX3NlbGVtX2dldF9jYXB0dXJlX3ZvbHVtZSwKKwkJCXNuZF9taXhlcl9zZWxlbV9zZXRfY2FwdHVyZV92b2x1bWUgfSwKKwkJICAgICAgeyBzbmRfbWl4ZXJfc2VsZW1fZ2V0X2NhcHR1cmVfZEJfcmFuZ2UsCisJCQlzbmRfbWl4ZXJfc2VsZW1fZ2V0X2NhcHR1cmVfZEIsCisJCQlzZXRfY2FwdHVyZV9kQiB9fSwKKwl9LAorfTsKKworc3RhdGljIGludCBzZXRfdm9sdW1lX3NpbXBsZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLAorCQkJICAgICBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNobiwKKwkJCSAgICAgY2hhciAqKnB0ciwgaW50IGRpcikKK3sKKwlsb25nIHZhbCwgb3JpZywgcG1pbiwgcG1heDsKKwljaGFyICpwID0gKnB0ciwgKnM7CisJaW50IGludmFsaWQgPSAwLCBlcnIgPSAwLCB2b2xfdHlwZSA9IFZPTF9SQVc7CisKKwlpZiAoISB2b2xfb3BzW2Rpcl0uaGFzX3ZvbHVtZShlbGVtKSkKKwkJaW52YWxpZCA9IDE7CisKKwlpZiAoKnAgPT0gJzonKQorCQlwKys7CisJaWYgKCpwID09ICdcMCcgfHwgKCFpc2RpZ2l0KCpwKSAmJiAqcCAhPSAnLScpKQorCQlnb3RvIHNraXA7CisKKwlpZiAoISBpbnZhbGlkICYmCisJICAgIHZvbF9vcHNbZGlyXS52W1ZPTF9SQVddLmdldF9yYW5nZShlbGVtLCAmcG1pbiwgJnBtYXgpIDwgMCkKKwkJaW52YWxpZCA9IDE7CisKKwlzID0gcDsKKwl2YWwgPSBzdHJ0b2wocywgJnAsIDEwKTsKKwlpZiAoKnAgPT0gJy4nKSB7CisJCXArKzsKKwkJc3RydG9sKHAsICZwLCAxMCk7CisJfQorCWlmICgqcCA9PSAnJScpIHsKKwkJaWYgKCEgaW52YWxpZCkKKwkJCXZhbCA9IChsb25nKWNvbnZlcnRfcHJhbmdlMShzdHJ0b2QocywgTlVMTCksIHBtaW4sIHBtYXgpOworCQlwKys7CisJfSBlbHNlIGlmIChwWzBdID09ICdkJyAmJiBwWzFdID09ICdCJykgeworCQlpZiAoISBpbnZhbGlkKSB7CisJCQl2YWwgPSAobG9uZykoc3RydG9kKHMsIE5VTEwpICogMTAwLjApOworCQkJdm9sX3R5cGUgPSBWT0xfREI7CisJCQlpZiAodm9sX29wc1tkaXJdLnZbdm9sX3R5cGVdLmdldF9yYW5nZShlbGVtLCAmcG1pbiwgJnBtYXgpIDwgMCkKKwkJCQlpbnZhbGlkID0gMTsKKwkJfQorCQlwICs9IDI7CisJfQorCWlmICgqcCA9PSAnKycgfHwgKnAgPT0gJy0nKSB7CisJCWlmICghIGludmFsaWQpIHsKKwkJCWlmICh2b2xfb3BzW2Rpcl0udlt2b2xfdHlwZV0uZ2V0KGVsZW0sIGNobiwgJm9yaWcpIDwgMCkKKwkJCQlpbnZhbGlkID0gMTsKKwkJCWlmICgqcCA9PSAnKycpCisJCQkJdmFsID0gb3JpZyArIHZhbDsKKwkJCWVsc2UKKwkJCQl2YWwgPSBvcmlnIC0gdmFsOworCQl9CisJCXArKzsKKwl9CisJaWYgKCEgaW52YWxpZCkgeworCQl2YWwgPSBjaGVja19yYW5nZSh2YWwsIHBtaW4sIHBtYXgpOworCQllcnIgPSB2b2xfb3BzW2Rpcl0udlt2b2xfdHlwZV0uc2V0KGVsZW0sIGNobiwgdmFsKTsKKwl9Cisgc2tpcDoKKwlpZiAoKnAgPT0gJywnKQorCQlwKys7CisJKnB0ciA9IHA7CisJcmV0dXJuIGVyciA/IGVyciA6IChpbnZhbGlkID8gLUVOT0VOVCA6IDApOworfQorCitzdGF0aWMgaW50IGdldF9ib29sX3NpbXBsZShjaGFyICoqcHRyLCBjaGFyICpzdHIsIGludCBpbnZlcnQsIGludCBvcmlnKQoreworCWlmICgqKnB0ciA9PSAnOicpCisJCSgqcHRyKSsrOworCWlmICghc3RybmNhc2VjbXAoKnB0ciwgc3RyLCBzdHJsZW4oc3RyKSkpIHsKKwkJb3JpZyA9IDEgXiAoaW52ZXJ0ID8gMSA6IDApOworCQl3aGlsZSAoKipwdHIgIT0gJ1wwJyAmJiAqKnB0ciAhPSAnLCcgJiYgKipwdHIgIT0gJzonKQorCQkJKCpwdHIpKys7CisJfQorCWlmICgqKnB0ciA9PSAnLCcgfHwgKipwdHIgPT0gJzonKQorCQkoKnB0cikrKzsKKwlyZXR1cm4gb3JpZzsKK30KKwkJCitzdGF0aWMgaW50IHNpbXBsZV9za2lwX3dvcmQoY2hhciAqKnB0ciwgY2hhciAqc3RyKQoreworCWNoYXIgKnhwdHIgPSAqcHRyOworCWlmICgqeHB0ciA9PSAnOicpCisJCXhwdHIrKzsKKwlpZiAoIXN0cm5jYXNlY21wKHhwdHIsIHN0ciwgc3RybGVuKHN0cikpKSB7CisJCXdoaWxlICgqeHB0ciAhPSAnXDAnICYmICp4cHRyICE9ICcsJyAmJiAqeHB0ciAhPSAnOicpCisJCQl4cHRyKys7CisJCWlmICgqeHB0ciA9PSAnLCcgfHwgKnhwdHIgPT0gJzonKQorCQkJeHB0cisrOworCQkqcHRyID0geHB0cjsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCQkKK3N0YXRpYyB2b2lkIHNob3dfY29udHJvbF9pZChzbmRfY3RsX2VsZW1faWRfdCAqaWQpCit7CisJdW5zaWduZWQgaW50IGluZGV4LCBkZXZpY2UsIHN1YmRldmljZTsKKwlwcmludGYoIm51bWlkPSV1LGlmYWNlPSVzLG5hbWU9JyVzJyIsCisJICAgICAgIHNuZF9jdGxfZWxlbV9pZF9nZXRfbnVtaWQoaWQpLAorCSAgICAgICBjb250cm9sX2lmYWNlKGlkKSwKKwkgICAgICAgc25kX2N0bF9lbGVtX2lkX2dldF9uYW1lKGlkKSk7CisJaW5kZXggPSBzbmRfY3RsX2VsZW1faWRfZ2V0X2luZGV4KGlkKTsKKwlkZXZpY2UgPSBzbmRfY3RsX2VsZW1faWRfZ2V0X2RldmljZShpZCk7CisJc3ViZGV2aWNlID0gc25kX2N0bF9lbGVtX2lkX2dldF9zdWJkZXZpY2UoaWQpOworCWlmIChpbmRleCkKKwkJcHJpbnRmKCIsaW5kZXg9JWkiLCBpbmRleCk7CisJaWYgKGRldmljZSkKKwkJcHJpbnRmKCIsZGV2aWNlPSVpIiwgZGV2aWNlKTsKKwlpZiAoc3ViZGV2aWNlKQorCQlwcmludGYoIixzdWJkZXZpY2U9JWkiLCBzdWJkZXZpY2UpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9zcGFjZXModW5zaWduZWQgaW50IHNwYWNlcykKK3sKKwl3aGlsZSAoc3BhY2VzLS0gPiAwKQorCQlwdXRjKCcgJywgc3Rkb3V0KTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfZEIobG9uZyBkQikKK3sKKwlwcmludGYoIiVsaS4lMDJsaWRCIiwgZEIgLyAxMDAsIChkQiA8IDAgPyAtZEIgOiBkQikgJSAxMDApOworfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfdGx2KHVuc2lnbmVkIGludCBzcGFjZXMsIHVuc2lnbmVkIGludCAqdGx2LCB1bnNpZ25lZCBpbnQgdGx2X3NpemUpCit7CisJdW5zaWduZWQgaW50IHR5cGUgPSB0bHZbMF07CisJdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgaW50IGlkeCA9IDA7CisKKwlpZiAodGx2X3NpemUgPCAyICogc2l6ZW9mKHVuc2lnbmVkIGludCkpIHsKKwkJcHJpbnRmKCJUTFYgc2l6ZSBlcnJvciFcbiIpOworCQlyZXR1cm47CisJfQorCXByaW50X3NwYWNlcyhzcGFjZXMpOworCXByaW50ZigifCAiKTsKKwl0eXBlID0gdGx2W2lkeCsrXTsKKwlzaXplID0gdGx2W2lkeCsrXTsKKwl0bHZfc2l6ZSAtPSAyICogc2l6ZW9mKHVuc2lnbmVkIGludCk7CisJaWYgKHNpemUgPiB0bHZfc2l6ZSkgeworCQlwcmludGYoIlRMViBzaXplIGVycm9yICglaSwgJWksICVpKSFcbiIsIHR5cGUsIHNpemUsIHRsdl9zaXplKTsKKwkJcmV0dXJuOworCX0KKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNORF9DVExfVExWVF9DT05UQUlORVI6CisJCXNpemUgKz0gc2l6ZW9mKHVuc2lnbmVkIGludCkgLTE7CisJCXNpemUgLz0gc2l6ZW9mKHVuc2lnbmVkIGludCk7CisJCXdoaWxlIChpZHggPCBzaXplKSB7CisJCQlpZiAodGx2W2lkeCsxXSA+IChzaXplIC0gaWR4KSAqIHNpemVvZih1bnNpZ25lZCBpbnQpKSB7CisJCQkJcHJpbnRmKCJUTFYgc2l6ZSBlcnJvciBpbiBjb21wb3VuZCFcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWRlY29kZV90bHYoc3BhY2VzICsgMiwgdGx2ICsgaWR4LCB0bHZbaWR4KzFdKTsKKwkJCWlkeCArPSAyICsgKHRsdlsxXSArIHNpemVvZih1bnNpZ25lZCBpbnQpIC0gMSkgLyBzaXplb2YodW5zaWduZWQgaW50KTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNORF9DVExfVExWVF9EQl9TQ0FMRToKKwkJcHJpbnRmKCJkQnNjYWxlLSIpOworCQlpZiAoc2l6ZSAhPSAyICogc2l6ZW9mKHVuc2lnbmVkIGludCkpIHsKKwkJCXdoaWxlIChzaXplID4gMCkgeworCQkJCXByaW50ZigiMHglMDh4LCIsIHRsdltpZHgrK10pOworCQkJCXNpemUgLT0gc2l6ZW9mKHVuc2lnbmVkIGludCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwcmludGYoIm1pbj0iKTsKKwkJCXByaW50X2RCKChpbnQpdGx2WzJdKTsKKwkJCXByaW50ZigiLHN0ZXA9Iik7CisJCQlwcmludF9kQih0bHZbM10gJiAweGZmZmYpOworCQkJcHJpbnRmKCIsbXV0ZT0laSIsICh0bHZbM10gPj4gMTYpICYgMSk7CisJCX0KKwkJYnJlYWs7CisjaWZkZWYgU05EX0NUTF9UTFZUX0RCX0xJTkVBUgorCWNhc2UgU05EX0NUTF9UTFZUX0RCX0xJTkVBUjoKKwkJcHJpbnRmKCJkQmxpbmVhci0iKTsKKwkJaWYgKHNpemUgIT0gMiAqIHNpemVvZih1bnNpZ25lZCBpbnQpKSB7CisJCQl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJCQlwcmludGYoIjB4JTA4eCwiLCB0bHZbaWR4KytdKTsKKwkJCQlzaXplIC09IHNpemVvZih1bnNpZ25lZCBpbnQpOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJpbnRmKCJtaW49Iik7CisJCQlwcmludF9kQih0bHZbMl0pOworCQkJcHJpbnRmKCIsbWF4PSIpOworCQkJcHJpbnRfZEIodGx2WzNdKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIFNORF9DVExfVExWVF9EQl9SQU5HRQorCWNhc2UgU05EX0NUTF9UTFZUX0RCX1JBTkdFOgorCQlwcmludGYoImRCcmFuZ2UtXG4iKTsKKwkJaWYgKChzaXplICUgKDYgKiBzaXplb2YodW5zaWduZWQgaW50KSkpICE9IDApIHsKKwkJCXdoaWxlIChzaXplID4gMCkgeworCQkJCXByaW50ZigiMHglMDh4LCIsIHRsdltpZHgrK10pOworCQkJCXNpemUgLT0gc2l6ZW9mKHVuc2lnbmVkIGludCk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJCXByaW50X3NwYWNlcyhzcGFjZXMgKyAyKTsKKwkJCXByaW50ZigicmFuZ2VtaW49JWksIiwgdGx2W2lkeCsrXSk7CisJCQlwcmludGYoIixyYW5nZW1heD0laVxuIiwgdGx2W2lkeCsrXSk7CisJCQlkZWNvZGVfdGx2KHNwYWNlcyArIDQsIHRsdiArIGlkeCwgNCAqIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKwkJCWlkeCArPSA0OworCQkJc2l6ZSAtPSA2ICogc2l6ZW9mKHVuc2lnbmVkIGludCk7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBTTkRfQ1RMX1RMVlRfREJfTUlOTUFYCisJY2FzZSBTTkRfQ1RMX1RMVlRfREJfTUlOTUFYOgorCWNhc2UgU05EX0NUTF9UTFZUX0RCX01JTk1BWF9NVVRFOgorCQlpZiAodHlwZSA9PSBTTkRfQ1RMX1RMVlRfREJfTUlOTUFYX01VVEUpCisJCQlwcmludGYoImRCbWlubWF4bXV0ZS0iKTsKKwkJZWxzZQorCQkJcHJpbnRmKCJkQm1pbm1heC0iKTsKKwkJaWYgKHNpemUgIT0gMiAqIHNpemVvZih1bnNpZ25lZCBpbnQpKSB7CisJCQl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJCQlwcmludGYoIjB4JTA4eCwiLCB0bHZbaWR4KytdKTsKKwkJCQlzaXplIC09IHNpemVvZih1bnNpZ25lZCBpbnQpOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJpbnRmKCJtaW49Iik7CisJCQlwcmludF9kQih0bHZbMl0pOworCQkJcHJpbnRmKCIsbWF4PSIpOworCQkJcHJpbnRfZEIodGx2WzNdKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCXByaW50ZigidW5rLSVpLSIsIHR5cGUpOworCQl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJCXByaW50ZigiMHglMDh4LCIsIHRsdltpZHgrK10pOworCQkJc2l6ZSAtPSBzaXplb2YodW5zaWduZWQgaW50KTsKKwkJfQorCQlicmVhazsKKwl9CisJcHV0YygnXG4nLCBzdGRvdXQpOworfQorCitzdGF0aWMgaW50IHNob3dfY29udHJvbChjb25zdCBjaGFyICpzcGFjZSwgc25kX2hjdGxfZWxlbV90ICplbGVtLAorCQkJaW50IGxldmVsKQoreworCWludCBlcnI7CisJdW5zaWduZWQgaW50IGl0ZW0sIGlkeCwgY291bnQsICp0bHY7CisJc25kX2N0bF9lbGVtX3R5cGVfdCB0eXBlOworCXNuZF9jdGxfZWxlbV9pZF90ICppZDsKKwlzbmRfY3RsX2VsZW1faW5mb190ICppbmZvOworCXNuZF9jdGxfZWxlbV92YWx1ZV90ICpjb250cm9sOworCXNuZF9hZXNfaWVjOTU4X3QgaWVjOTU4OworCXNuZF9jdGxfZWxlbV9pZF9hbGxvY2EoJmlkKTsKKwlzbmRfY3RsX2VsZW1faW5mb19hbGxvY2EoJmluZm8pOworCXNuZF9jdGxfZWxlbV92YWx1ZV9hbGxvY2EoJmNvbnRyb2wpOworCWlmICgoZXJyID0gc25kX2hjdGxfZWxlbV9pbmZvKGVsZW0sIGluZm8pKSA8IDApIHsKKwkJZXJyb3IoIkNvbnRyb2wgJXMgc25kX2hjdGxfZWxlbV9pbmZvIGVycm9yOiAlc1xuIiwgY2FyZCwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gZXJyOworCX0KKwlpZiAobGV2ZWwgJiBMRVZFTF9JRCkgeworCQlzbmRfaGN0bF9lbGVtX2dldF9pZChlbGVtLCBpZCk7CisJCXNob3dfY29udHJvbF9pZChpZCk7CisJCXByaW50ZigiXG4iKTsKKwl9CisJY291bnQgPSBzbmRfY3RsX2VsZW1faW5mb19nZXRfY291bnQoaW5mbyk7CisJdHlwZSA9IHNuZF9jdGxfZWxlbV9pbmZvX2dldF90eXBlKGluZm8pOworCXByaW50ZigiJXM7IHR5cGU9JXMsYWNjZXNzPSVzLHZhbHVlcz0laSIsIHNwYWNlLCBjb250cm9sX3R5cGUoaW5mbyksIGNvbnRyb2xfYWNjZXNzKGluZm8pLCBjb3VudCk7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTTkRfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOgorCQlwcmludGYoIixtaW49JWxpLG1heD0lbGksc3RlcD0lbGlcbiIsIAorCQkgICAgICAgc25kX2N0bF9lbGVtX2luZm9fZ2V0X21pbihpbmZvKSwKKwkJICAgICAgIHNuZF9jdGxfZWxlbV9pbmZvX2dldF9tYXgoaW5mbyksCisJCSAgICAgICBzbmRfY3RsX2VsZW1faW5mb19nZXRfc3RlcChpbmZvKSk7CisJCWJyZWFrOworCWNhc2UgU05EX0NUTF9FTEVNX1RZUEVfSU5URUdFUjY0OgorCQlwcmludGYoIixtaW49JUxpLG1heD0lTGksc3RlcD0lTGlcbiIsIAorCQkgICAgICAgc25kX2N0bF9lbGVtX2luZm9fZ2V0X21pbjY0KGluZm8pLAorCQkgICAgICAgc25kX2N0bF9lbGVtX2luZm9fZ2V0X21heDY0KGluZm8pLAorCQkgICAgICAgc25kX2N0bF9lbGVtX2luZm9fZ2V0X3N0ZXA2NChpbmZvKSk7CisJCWJyZWFrOworCWNhc2UgU05EX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDoKKwl7CisJCXVuc2lnbmVkIGludCBpdGVtcyA9IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9pdGVtcyhpbmZvKTsKKwkJcHJpbnRmKCIsaXRlbXM9JXVcbiIsIGl0ZW1zKTsKKwkJZm9yIChpdGVtID0gMDsgaXRlbSA8IGl0ZW1zOyBpdGVtKyspIHsKKwkJCXNuZF9jdGxfZWxlbV9pbmZvX3NldF9pdGVtKGluZm8sIGl0ZW0pOworCQkJaWYgKChlcnIgPSBzbmRfaGN0bF9lbGVtX2luZm8oZWxlbSwgaW5mbykpIDwgMCkgeworCQkJCWVycm9yKCJDb250cm9sICVzIGVsZW1lbnQgaW5mbyBlcnJvcjogJXNcbiIsIGNhcmQsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQorCQkJcHJpbnRmKCIlczsgSXRlbSAjJXUgJyVzJ1xuIiwgc3BhY2UsIGl0ZW0sIHNuZF9jdGxfZWxlbV9pbmZvX2dldF9pdGVtX25hbWUoaW5mbykpOworCQl9CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlwcmludGYoIlxuIik7CisJCWJyZWFrOworCX0KKwlpZiAobGV2ZWwgJiBMRVZFTF9CQVNJQykgeworCQlpZiAoIXNuZF9jdGxfZWxlbV9pbmZvX2lzX3JlYWRhYmxlKGluZm8pKQorCQkJZ290byBfX3NraXBfcmVhZDsKKwkJaWYgKChlcnIgPSBzbmRfaGN0bF9lbGVtX3JlYWQoZWxlbSwgY29udHJvbCkpIDwgMCkgeworCQkJZXJyb3IoIkNvbnRyb2wgJXMgZWxlbWVudCByZWFkIGVycm9yOiAlc1xuIiwgY2FyZCwgc25kX3N0cmVycm9yKGVycikpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlwcmludGYoIiVzOiB2YWx1ZXM9Iiwgc3BhY2UpOworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IGNvdW50OyBpZHgrKykgeworCQkJaWYgKGlkeCA+IDApCisJCQkJcHJpbnRmKCIsIik7CisJCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCWNhc2UgU05EX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjoKKwkJCQlwcmludGYoIiVzIiwgc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9ib29sZWFuKGNvbnRyb2wsIGlkeCkgPyAib24iIDogIm9mZiIpOworCQkJCWJyZWFrOworCQkJY2FzZSBTTkRfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOgorCQkJCXByaW50ZigiJWxpIiwgc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9pbnRlZ2VyKGNvbnRyb2wsIGlkeCkpOworCQkJCWJyZWFrOworCQkJY2FzZSBTTkRfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSNjQ6CisJCQkJcHJpbnRmKCIlTGkiLCBzbmRfY3RsX2VsZW1fdmFsdWVfZ2V0X2ludGVnZXI2NChjb250cm9sLCBpZHgpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU05EX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDoKKwkJCQlwcmludGYoIiV1Iiwgc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9lbnVtZXJhdGVkKGNvbnRyb2wsIGlkeCkpOworCQkJCWJyZWFrOworCQkJY2FzZSBTTkRfQ1RMX0VMRU1fVFlQRV9CWVRFUzoKKwkJCQlwcmludGYoIjB4JTAyeCIsIHNuZF9jdGxfZWxlbV92YWx1ZV9nZXRfYnl0ZShjb250cm9sLCBpZHgpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU05EX0NUTF9FTEVNX1RZUEVfSUVDOTU4OgorCQkJCXNuZF9jdGxfZWxlbV92YWx1ZV9nZXRfaWVjOTU4KGNvbnRyb2wsICZpZWM5NTgpOworCQkJCXByaW50ZigiW0FFUzA9MHglMDJ4IEFFUzE9MHglMDJ4IEFFUzI9MHglMDJ4IEFFUzM9MHglMDJ4XSIsCisJCQkJICAgICAgIGllYzk1OC5zdGF0dXNbMF0sIGllYzk1OC5zdGF0dXNbMV0sCisJCQkJICAgICAgIGllYzk1OC5zdGF0dXNbMl0sIGllYzk1OC5zdGF0dXNbM10pOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGYoIj8iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlwcmludGYoIlxuIik7CisJICAgICAgX19za2lwX3JlYWQ6CisJCWlmICghc25kX2N0bF9lbGVtX2luZm9faXNfdGx2X3JlYWRhYmxlKGluZm8pKQorCQkJZ290byBfX3NraXBfdGx2OworCQl0bHYgPSBtYWxsb2MoNDA5Nik7CisJCWlmICgoZXJyID0gc25kX2hjdGxfZWxlbV90bHZfcmVhZChlbGVtLCB0bHYsIDQwOTYpKSA8IDApIHsKKwkJCWVycm9yKCJDb250cm9sICVzIGVsZW1lbnQgVExWIHJlYWQgZXJyb3I6ICVzXG4iLCBjYXJkLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQlmcmVlKHRsdik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWRlY29kZV90bHYoc3RybGVuKHNwYWNlKSwgdGx2LCA0MDk2KTsKKwkJZnJlZSh0bHYpOworCX0KKyAgICAgIF9fc2tpcF90bHY6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29udHJvbHMoaW50IGxldmVsKQoreworCWludCBlcnI7CisJc25kX2hjdGxfdCAqaGFuZGxlOworCXNuZF9oY3RsX2VsZW1fdCAqZWxlbTsKKwlzbmRfY3RsX2VsZW1faWRfdCAqaWQ7CisJc25kX2N0bF9lbGVtX2luZm9fdCAqaW5mbzsKKwlzbmRfY3RsX2VsZW1faWRfYWxsb2NhKCZpZCk7CisJc25kX2N0bF9lbGVtX2luZm9fYWxsb2NhKCZpbmZvKTsKKwkKKwlpZiAoKGVyciA9IHNuZF9oY3RsX29wZW4oJmhhbmRsZSwgY2FyZCwgMCkpIDwgMCkgeworCQllcnJvcigiQ29udHJvbCAlcyBvcGVuIGVycm9yOiAlcyIsIGNhcmQsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKChlcnIgPSBzbmRfaGN0bF9sb2FkKGhhbmRsZSkpIDwgMCkgeworCQllcnJvcigiQ29udHJvbCAlcyBsb2NhbCBlcnJvcjogJXNcbiIsIGNhcmQsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJZm9yIChlbGVtID0gc25kX2hjdGxfZmlyc3RfZWxlbShoYW5kbGUpOyBlbGVtOyBlbGVtID0gc25kX2hjdGxfZWxlbV9uZXh0KGVsZW0pKSB7CisJCWlmICgoZXJyID0gc25kX2hjdGxfZWxlbV9pbmZvKGVsZW0sIGluZm8pKSA8IDApIHsKKwkJCWVycm9yKCJDb250cm9sICVzIHNuZF9oY3RsX2VsZW1faW5mbyBlcnJvcjogJXNcbiIsIGNhcmQsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJaWYgKCEobGV2ZWwgJiBMRVZFTF9JTkFDVElWRSkgJiYgc25kX2N0bF9lbGVtX2luZm9faXNfaW5hY3RpdmUoaW5mbykpCisJCQljb250aW51ZTsKKwkJc25kX2hjdGxfZWxlbV9nZXRfaWQoZWxlbSwgaWQpOworCQlzaG93X2NvbnRyb2xfaWQoaWQpOworCQlwcmludGYoIlxuIik7CisJCWlmIChsZXZlbCAmIExFVkVMX0JBU0lDKQorCQkJc2hvd19jb250cm9sKCIgICIsIGVsZW0sIDEpOworCX0KKwlzbmRfaGN0bF9jbG9zZShoYW5kbGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNob3dfc2VsZW0oc25kX21peGVyX3QgKmhhbmRsZSwgc25kX21peGVyX3NlbGVtX2lkX3QgKmlkLCBjb25zdCBjaGFyICpzcGFjZSwgaW50IGxldmVsKQoreworCXNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgY2huOworCWxvbmcgcG1pbiA9IDAsIHBtYXggPSAwOworCWxvbmcgY21pbiA9IDAsIGNtYXggPSAwOworCWxvbmcgcHZvbCwgY3ZvbDsKKwlpbnQgcHN3LCBjc3c7CisJaW50IHBtb25vLCBjbW9ubywgbW9ub19vayA9IDA7CisJbG9uZyBkYjsKKwlzbmRfbWl4ZXJfZWxlbV90ICplbGVtOworCQorCWVsZW0gPSBzbmRfbWl4ZXJfZmluZF9zZWxlbShoYW5kbGUsIGlkKTsKKwlpZiAoIWVsZW0pIHsKKwkJZXJyb3IoIk1peGVyICVzIHNpbXBsZSBlbGVtZW50IG5vdCBmb3VuZCIsIGNhcmQpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlpZiAobGV2ZWwgJiBMRVZFTF9CQVNJQykgeworCQlwcmludGYoIiVzQ2FwYWJpbGl0aWVzOiIsIHNwYWNlKTsKKwkJaWYgKHNuZF9taXhlcl9zZWxlbV9oYXNfY29tbW9uX3ZvbHVtZShlbGVtKSkgeworCQkJcHJpbnRmKCIgdm9sdW1lIik7CisJCQlpZiAoc25kX21peGVyX3NlbGVtX2hhc19wbGF5YmFja192b2x1bWVfam9pbmVkKGVsZW0pKQorCQkJCXByaW50ZigiIHZvbHVtZS1qb2luZWQiKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChzbmRfbWl4ZXJfc2VsZW1faGFzX3BsYXliYWNrX3ZvbHVtZShlbGVtKSkgeworCQkJCXByaW50ZigiIHB2b2x1bWUiKTsKKwkJCQlpZiAoc25kX21peGVyX3NlbGVtX2hhc19wbGF5YmFja192b2x1bWVfam9pbmVkKGVsZW0pKQorCQkJCQlwcmludGYoIiBwdm9sdW1lLWpvaW5lZCIpOworCQkJfQorCQkJaWYgKHNuZF9taXhlcl9zZWxlbV9oYXNfY2FwdHVyZV92b2x1bWUoZWxlbSkpIHsKKwkJCQlwcmludGYoIiBjdm9sdW1lIik7CisJCQkJaWYgKHNuZF9taXhlcl9zZWxlbV9oYXNfY2FwdHVyZV92b2x1bWVfam9pbmVkKGVsZW0pKQorCQkJCQlwcmludGYoIiBjdm9sdW1lLWpvaW5lZCIpOworCQkJfQorCQl9CisJCWlmIChzbmRfbWl4ZXJfc2VsZW1faGFzX2NvbW1vbl9zd2l0Y2goZWxlbSkpIHsKKwkJCXByaW50ZigiIHN3aXRjaCIpOworCQkJaWYgKHNuZF9taXhlcl9zZWxlbV9oYXNfcGxheWJhY2tfc3dpdGNoX2pvaW5lZChlbGVtKSkKKwkJCQlwcmludGYoIiBzd2l0Y2gtam9pbmVkIik7CisJCX0gZWxzZSB7CisJCQlpZiAoc25kX21peGVyX3NlbGVtX2hhc19wbGF5YmFja19zd2l0Y2goZWxlbSkpIHsKKwkJCQlwcmludGYoIiBwc3dpdGNoIik7CisJCQkJaWYgKHNuZF9taXhlcl9zZWxlbV9oYXNfcGxheWJhY2tfc3dpdGNoX2pvaW5lZChlbGVtKSkKKwkJCQkJcHJpbnRmKCIgcHN3aXRjaC1qb2luZWQiKTsKKwkJCX0KKwkJCWlmIChzbmRfbWl4ZXJfc2VsZW1faGFzX2NhcHR1cmVfc3dpdGNoKGVsZW0pKSB7CisJCQkJcHJpbnRmKCIgY3N3aXRjaCIpOworCQkJCWlmIChzbmRfbWl4ZXJfc2VsZW1faGFzX2NhcHR1cmVfc3dpdGNoX2pvaW5lZChlbGVtKSkKKwkJCQkJcHJpbnRmKCIgY3N3aXRjaC1qb2luZWQiKTsKKwkJCQlpZiAoc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3N3aXRjaF9leGNsdXNpdmUoZWxlbSkpCisJCQkJCXByaW50ZigiIGNzd2l0Y2gtZXhjbHVzaXZlIik7CisJCQl9CisJCX0KKwkJaWYgKHNuZF9taXhlcl9zZWxlbV9pc19lbnVtX3BsYXliYWNrKGVsZW0pKSB7CisJCQlwcmludGYoIiBwZW51bSIpOworCQl9IGVsc2UgaWYgKHNuZF9taXhlcl9zZWxlbV9pc19lbnVtX2NhcHR1cmUoZWxlbSkpIHsKKwkJCXByaW50ZigiIGNlbnVtIik7CisJCX0gZWxzZSBpZiAoc25kX21peGVyX3NlbGVtX2lzX2VudW1lcmF0ZWQoZWxlbSkpIHsKKwkJCXByaW50ZigiIGVudW0iKTsKKwkJfQorCQlwcmludGYoIlxuIik7CisJCWlmIChzbmRfbWl4ZXJfc2VsZW1faXNfZW51bWVyYXRlZChlbGVtKSkgeworCQkJaW50IGksIGl0ZW1zOworCQkJdW5zaWduZWQgaW50IGlkeDsKKwkJCWNoYXIgaXRlbW5hbWVbNDBdOworCQkJaXRlbXMgPSBzbmRfbWl4ZXJfc2VsZW1fZ2V0X2VudW1faXRlbXMoZWxlbSk7CisJCQlwcmludGYoIiAgSXRlbXM6Iik7CisJCQlmb3IgKGkgPSAwOyBpIDwgaXRlbXM7IGkrKykgeworCQkJCXNuZF9taXhlcl9zZWxlbV9nZXRfZW51bV9pdGVtX25hbWUoZWxlbSwgaSwgc2l6ZW9mKGl0ZW1uYW1lKSAtIDEsIGl0ZW1uYW1lKTsKKwkJCQlwcmludGYoIiAnJXMnIiwgaXRlbW5hbWUpOworCQkJfQorCQkJcHJpbnRmKCJcbiIpOworCQkJZm9yIChpID0gMDsgIXNuZF9taXhlcl9zZWxlbV9nZXRfZW51bV9pdGVtKGVsZW0sIGksICZpZHgpOyBpKyspIHsKKwkJCQlzbmRfbWl4ZXJfc2VsZW1fZ2V0X2VudW1faXRlbV9uYW1lKGVsZW0sIGlkeCwgc2l6ZW9mKGl0ZW1uYW1lKSAtIDEsIGl0ZW1uYW1lKTsKKwkJCQlwcmludGYoIiAgSXRlbSVkOiAnJXMnXG4iLCBpLCBpdGVtbmFtZSk7CisJCQl9CisJCQlyZXR1cm4gMDsgLyogbm8gbW9yZSB0aGluZyB0byBkbyAqLworCQl9CisJCWlmIChzbmRfbWl4ZXJfc2VsZW1faGFzX2NhcHR1cmVfc3dpdGNoX2V4Y2x1c2l2ZShlbGVtKSkKKwkJCXByaW50ZigiJXNDYXB0dXJlIGV4Y2x1c2l2ZSBncm91cDogJWlcbiIsIHNwYWNlLAorCQkJICAgICAgIHNuZF9taXhlcl9zZWxlbV9nZXRfY2FwdHVyZV9ncm91cChlbGVtKSk7CisJCWlmIChzbmRfbWl4ZXJfc2VsZW1faGFzX3BsYXliYWNrX3ZvbHVtZShlbGVtKSB8fAorCQkgICAgc25kX21peGVyX3NlbGVtX2hhc19wbGF5YmFja19zd2l0Y2goZWxlbSkpIHsKKwkJCXByaW50ZigiJXNQbGF5YmFjayBjaGFubmVsczoiLCBzcGFjZSk7CisJCQlpZiAoc25kX21peGVyX3NlbGVtX2lzX3BsYXliYWNrX21vbm8oZWxlbSkpIHsKKwkJCQlwcmludGYoIiBNb25vIik7CisJCQl9IGVsc2UgeworCQkJCWludCBmaXJzdCA9IDE7CisJCQkJZm9yIChjaG4gPSAwOyBjaG4gPD0gU05EX01JWEVSX1NDSE5fTEFTVDsgY2huKyspeworCQkJCQlpZiAoIXNuZF9taXhlcl9zZWxlbV9oYXNfcGxheWJhY2tfY2hhbm5lbChlbGVtLCBjaG4pKQorCQkJCQkJY29udGludWU7CisJCQkJCWlmICghZmlyc3QpCisJCQkJCQlwcmludGYoIiAtIik7CisJCQkJCXByaW50ZigiICVzIiwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfbmFtZShjaG4pKTsKKwkJCQkJZmlyc3QgPSAwOworCQkJCX0KKwkJCX0KKwkJCXByaW50ZigiXG4iKTsKKwkJfQorCQlpZiAoc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3ZvbHVtZShlbGVtKSB8fAorCQkgICAgc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3N3aXRjaChlbGVtKSkgeworCQkJcHJpbnRmKCIlc0NhcHR1cmUgY2hhbm5lbHM6Iiwgc3BhY2UpOworCQkJaWYgKHNuZF9taXhlcl9zZWxlbV9pc19jYXB0dXJlX21vbm8oZWxlbSkpIHsKKwkJCQlwcmludGYoIiBNb25vIik7CisJCQl9IGVsc2UgeworCQkJCWludCBmaXJzdCA9IDE7CisJCQkJZm9yIChjaG4gPSAwOyBjaG4gPD0gU05EX01JWEVSX1NDSE5fTEFTVDsgY2huKyspeworCQkJCQlpZiAoIXNuZF9taXhlcl9zZWxlbV9oYXNfY2FwdHVyZV9jaGFubmVsKGVsZW0sIGNobikpCisJCQkJCQljb250aW51ZTsKKwkJCQkJaWYgKCFmaXJzdCkKKwkJCQkJCXByaW50ZigiIC0iKTsKKwkJCQkJcHJpbnRmKCIgJXMiLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9uYW1lKGNobikpOworCQkJCQlmaXJzdCA9IDA7CisJCQkJfQorCQkJfQorCQkJcHJpbnRmKCJcbiIpOworCQl9CisJCWlmIChzbmRfbWl4ZXJfc2VsZW1faGFzX3BsYXliYWNrX3ZvbHVtZShlbGVtKSB8fAorCQkgICAgc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3ZvbHVtZShlbGVtKSkgeworCQkJcHJpbnRmKCIlc0xpbWl0czoiLCBzcGFjZSk7CisJCQlpZiAoc25kX21peGVyX3NlbGVtX2hhc19jb21tb25fdm9sdW1lKGVsZW0pKSB7CisJCQkJc25kX21peGVyX3NlbGVtX2dldF9wbGF5YmFja192b2x1bWVfcmFuZ2UoZWxlbSwgJnBtaW4sICZwbWF4KTsKKwkJCQlzbmRfbWl4ZXJfc2VsZW1fZ2V0X2NhcHR1cmVfdm9sdW1lX3JhbmdlKGVsZW0sICZjbWluLCAmY21heCk7CisJCQkJcHJpbnRmKCIgJWxpIC0gJWxpIiwgcG1pbiwgcG1heCk7CisJCQl9IGVsc2UgeworCQkJCWlmIChzbmRfbWl4ZXJfc2VsZW1faGFzX3BsYXliYWNrX3ZvbHVtZShlbGVtKSkgeworCQkJCQlzbmRfbWl4ZXJfc2VsZW1fZ2V0X3BsYXliYWNrX3ZvbHVtZV9yYW5nZShlbGVtLCAmcG1pbiwgJnBtYXgpOworCQkJCQlwcmludGYoIiBQbGF5YmFjayAlbGkgLSAlbGkiLCBwbWluLCBwbWF4KTsKKwkJCQl9CisJCQkJaWYgKHNuZF9taXhlcl9zZWxlbV9oYXNfY2FwdHVyZV92b2x1bWUoZWxlbSkpIHsKKwkJCQkJc25kX21peGVyX3NlbGVtX2dldF9jYXB0dXJlX3ZvbHVtZV9yYW5nZShlbGVtLCAmY21pbiwgJmNtYXgpOworCQkJCQlwcmludGYoIiBDYXB0dXJlICVsaSAtICVsaSIsIGNtaW4sIGNtYXgpOworCQkJCX0KKwkJCX0KKwkJCXByaW50ZigiXG4iKTsKKwkJfQorCQlwbW9ubyA9IHNuZF9taXhlcl9zZWxlbV9oYXNfcGxheWJhY2tfY2hhbm5lbChlbGVtLCBTTkRfTUlYRVJfU0NITl9NT05PKSAmJgorCQkgICAgICAgIChzbmRfbWl4ZXJfc2VsZW1faXNfcGxheWJhY2tfbW9ubyhlbGVtKSB8fCAKKwkJCSAoIXNuZF9taXhlcl9zZWxlbV9oYXNfcGxheWJhY2tfdm9sdW1lKGVsZW0pICYmCisJCQkgICFzbmRfbWl4ZXJfc2VsZW1faGFzX3BsYXliYWNrX3N3aXRjaChlbGVtKSkpOworCQljbW9ubyA9IHNuZF9taXhlcl9zZWxlbV9oYXNfY2FwdHVyZV9jaGFubmVsKGVsZW0sIFNORF9NSVhFUl9TQ0hOX01PTk8pICYmCisJCSAgICAgICAgKHNuZF9taXhlcl9zZWxlbV9pc19jYXB0dXJlX21vbm8oZWxlbSkgfHwgCisJCQkgKCFzbmRfbWl4ZXJfc2VsZW1faGFzX2NhcHR1cmVfdm9sdW1lKGVsZW0pICYmCisJCQkgICFzbmRfbWl4ZXJfc2VsZW1faGFzX2NhcHR1cmVfc3dpdGNoKGVsZW0pKSk7CisjaWYgMAorCQlwcmludGYoInBtb25vID0gJWksIGNtb25vID0gJWkgKCVpLCAlaSwgJWksICVpKVxuIiwgcG1vbm8sIGNtb25vLAorCQkJCXNuZF9taXhlcl9zZWxlbV9oYXNfY2FwdHVyZV9jaGFubmVsKGVsZW0sIFNORF9NSVhFUl9TQ0hOX01PTk8pLAorCQkJCXNuZF9taXhlcl9zZWxlbV9pc19jYXB0dXJlX21vbm8oZWxlbSksCisJCQkJc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3ZvbHVtZShlbGVtKSwKKwkJCQlzbmRfbWl4ZXJfc2VsZW1faGFzX2NhcHR1cmVfc3dpdGNoKGVsZW0pKTsKKyNlbmRpZgorCQlpZiAocG1vbm8gfHwgY21vbm8pIHsKKwkJCWlmICghbW9ub19vaykgeworCQkJCXByaW50ZigiJXMlczoiLCBzcGFjZSwgIk1vbm8iKTsKKwkJCQltb25vX29rID0gMTsKKwkJCX0KKwkJCWlmIChzbmRfbWl4ZXJfc2VsZW1faGFzX2NvbW1vbl92b2x1bWUoZWxlbSkpIHsKKwkJCQlzbmRfbWl4ZXJfc2VsZW1fZ2V0X3BsYXliYWNrX3ZvbHVtZShlbGVtLCBTTkRfTUlYRVJfU0NITl9NT05PLCAmcHZvbCk7CisJCQkJcHJpbnRmKCIgJXMiLCBnZXRfcGVyY2VudChwdm9sLCBwbWluLCBwbWF4KSk7CisJCQkJaWYgKCFzbmRfbWl4ZXJfc2VsZW1fZ2V0X3BsYXliYWNrX2RCKGVsZW0sIFNORF9NSVhFUl9TQ0hOX01PTk8sICZkYikpIHsKKwkJCQkJcHJpbnRmKCIgWyIpOworCQkJCQlwcmludF9kQihkYik7CisJCQkJCXByaW50ZigiXSIpOworCQkJCX0KKwkJCX0KKwkJCWlmIChzbmRfbWl4ZXJfc2VsZW1faGFzX2NvbW1vbl9zd2l0Y2goZWxlbSkpIHsKKwkJCQlzbmRfbWl4ZXJfc2VsZW1fZ2V0X3BsYXliYWNrX3N3aXRjaChlbGVtLCBTTkRfTUlYRVJfU0NITl9NT05PLCAmcHN3KTsKKwkJCQlwcmludGYoIiBbJXNdIiwgcHN3ID8gIm9uIiA6ICJvZmYiKTsKKwkJCX0KKwkJfQorCQlpZiAocG1vbm8gJiYgc25kX21peGVyX3NlbGVtX2hhc19wbGF5YmFja19jaGFubmVsKGVsZW0sIFNORF9NSVhFUl9TQ0hOX01PTk8pKSB7CisJCQlpbnQgdGl0bGUgPSAwOworCQkJaWYgKCFtb25vX29rKSB7CisJCQkJcHJpbnRmKCIlcyVzOiIsIHNwYWNlLCAiTW9ubyIpOworCQkJCW1vbm9fb2sgPSAxOworCQkJfQorCQkJaWYgKCFzbmRfbWl4ZXJfc2VsZW1faGFzX2NvbW1vbl92b2x1bWUoZWxlbSkpIHsKKwkJCQlpZiAoc25kX21peGVyX3NlbGVtX2hhc19wbGF5YmFja192b2x1bWUoZWxlbSkpIHsKKwkJCQkJcHJpbnRmKCIgUGxheWJhY2siKTsKKwkJCQkJdGl0bGUgPSAxOworCQkJCQlzbmRfbWl4ZXJfc2VsZW1fZ2V0X3BsYXliYWNrX3ZvbHVtZShlbGVtLCBTTkRfTUlYRVJfU0NITl9NT05PLCAmcHZvbCk7CisJCQkJCXByaW50ZigiICVzIiwgZ2V0X3BlcmNlbnQocHZvbCwgcG1pbiwgcG1heCkpOworCQkJCQlpZiAoIXNuZF9taXhlcl9zZWxlbV9nZXRfcGxheWJhY2tfZEIoZWxlbSwgU05EX01JWEVSX1NDSE5fTU9OTywgJmRiKSkgeworCQkJCQkJcHJpbnRmKCIgWyIpOworCQkJCQkJcHJpbnRfZEIoZGIpOworCQkJCQkJcHJpbnRmKCJdIik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAoIXNuZF9taXhlcl9zZWxlbV9oYXNfY29tbW9uX3N3aXRjaChlbGVtKSkgeworCQkJCWlmIChzbmRfbWl4ZXJfc2VsZW1faGFzX3BsYXliYWNrX3N3aXRjaChlbGVtKSkgeworCQkJCQlpZiAoIXRpdGxlKQorCQkJCQkJcHJpbnRmKCIgUGxheWJhY2siKTsKKwkJCQkJc25kX21peGVyX3NlbGVtX2dldF9wbGF5YmFja19zd2l0Y2goZWxlbSwgU05EX01JWEVSX1NDSE5fTU9OTywgJnBzdyk7CisJCQkJCXByaW50ZigiIFslc10iLCBwc3cgPyAib24iIDogIm9mZiIpOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoY21vbm8gJiYgc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX2NoYW5uZWwoZWxlbSwgU05EX01JWEVSX1NDSE5fTU9OTykpIHsKKwkJCWludCB0aXRsZSA9IDA7CisJCQlpZiAoIW1vbm9fb2spIHsKKwkJCQlwcmludGYoIiVzJXM6Iiwgc3BhY2UsICJNb25vIik7CisJCQkJbW9ub19vayA9IDE7CisJCQl9CisJCQlpZiAoIXNuZF9taXhlcl9zZWxlbV9oYXNfY29tbW9uX3ZvbHVtZShlbGVtKSkgeworCQkJCWlmIChzbmRfbWl4ZXJfc2VsZW1faGFzX2NhcHR1cmVfdm9sdW1lKGVsZW0pKSB7CisJCQkJCXByaW50ZigiIENhcHR1cmUiKTsKKwkJCQkJdGl0bGUgPSAxOworCQkJCQlzbmRfbWl4ZXJfc2VsZW1fZ2V0X2NhcHR1cmVfdm9sdW1lKGVsZW0sIFNORF9NSVhFUl9TQ0hOX01PTk8sICZjdm9sKTsKKwkJCQkJcHJpbnRmKCIgJXMiLCBnZXRfcGVyY2VudChjdm9sLCBjbWluLCBjbWF4KSk7CisJCQkJCWlmICghc25kX21peGVyX3NlbGVtX2dldF9jYXB0dXJlX2RCKGVsZW0sIFNORF9NSVhFUl9TQ0hOX01PTk8sICZkYikpIHsKKwkJCQkJCXByaW50ZigiIFsiKTsKKwkJCQkJCXByaW50X2RCKGRiKTsKKwkJCQkJCXByaW50ZigiXSIpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKCFzbmRfbWl4ZXJfc2VsZW1faGFzX2NvbW1vbl9zd2l0Y2goZWxlbSkpIHsKKwkJCQlpZiAoc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3N3aXRjaChlbGVtKSkgeworCQkJCQlpZiAoIXRpdGxlKQorCQkJCQkJcHJpbnRmKCIgQ2FwdHVyZSIpOworCQkJCQlzbmRfbWl4ZXJfc2VsZW1fZ2V0X2NhcHR1cmVfc3dpdGNoKGVsZW0sIFNORF9NSVhFUl9TQ0hOX01PTk8sICZjc3cpOworCQkJCQlwcmludGYoIiBbJXNdIiwgY3N3ID8gIm9uIiA6ICJvZmYiKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHBtb25vIHx8IGNtb25vKQorCQkJcHJpbnRmKCJcbiIpOworCQlpZiAoIXBtb25vIHx8ICFjbW9ubykgeworCQkJZm9yIChjaG4gPSAwOyBjaG4gPD0gU05EX01JWEVSX1NDSE5fTEFTVDsgY2huKyspIHsKKwkJCQlpZiAoKHBtb25vIHx8ICFzbmRfbWl4ZXJfc2VsZW1faGFzX3BsYXliYWNrX2NoYW5uZWwoZWxlbSwgY2huKSkgJiYKKwkJCQkgICAgKGNtb25vIHx8ICFzbmRfbWl4ZXJfc2VsZW1faGFzX2NhcHR1cmVfY2hhbm5lbChlbGVtLCBjaG4pKSkKKwkJCQkJY29udGludWU7CisJCQkJcHJpbnRmKCIlcyVzOiIsIHNwYWNlLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9uYW1lKGNobikpOworCQkJCWlmICghcG1vbm8gJiYgIWNtb25vICYmIHNuZF9taXhlcl9zZWxlbV9oYXNfY29tbW9uX3ZvbHVtZShlbGVtKSkgeworCQkJCQlzbmRfbWl4ZXJfc2VsZW1fZ2V0X3BsYXliYWNrX3ZvbHVtZShlbGVtLCBjaG4sICZwdm9sKTsKKwkJCQkJcHJpbnRmKCIgJXMiLCBnZXRfcGVyY2VudChwdm9sLCBwbWluLCBwbWF4KSk7CisJCQkJCWlmICghc25kX21peGVyX3NlbGVtX2dldF9wbGF5YmFja19kQihlbGVtLCBjaG4sICZkYikpIHsKKwkJCQkJCXByaW50ZigiIFsiKTsKKwkJCQkJCXByaW50X2RCKGRiKTsKKwkJCQkJCXByaW50ZigiXSIpOworCQkJCQl9CisJCQkJfQorCQkJCWlmICghcG1vbm8gJiYgIWNtb25vICYmIHNuZF9taXhlcl9zZWxlbV9oYXNfY29tbW9uX3N3aXRjaChlbGVtKSkgeworCQkJCQlzbmRfbWl4ZXJfc2VsZW1fZ2V0X3BsYXliYWNrX3N3aXRjaChlbGVtLCBjaG4sICZwc3cpOworCQkJCQlwcmludGYoIiBbJXNdIiwgcHN3ID8gIm9uIiA6ICJvZmYiKTsKKwkJCQl9CisJCQkJaWYgKCFwbW9ubyAmJiBzbmRfbWl4ZXJfc2VsZW1faGFzX3BsYXliYWNrX2NoYW5uZWwoZWxlbSwgY2huKSkgeworCQkJCQlpbnQgdGl0bGUgPSAwOworCQkJCQlpZiAoIXNuZF9taXhlcl9zZWxlbV9oYXNfY29tbW9uX3ZvbHVtZShlbGVtKSkgeworCQkJCQkJaWYgKHNuZF9taXhlcl9zZWxlbV9oYXNfcGxheWJhY2tfdm9sdW1lKGVsZW0pKSB7CisJCQkJCQkJcHJpbnRmKCIgUGxheWJhY2siKTsKKwkJCQkJCQl0aXRsZSA9IDE7CisJCQkJCQkJc25kX21peGVyX3NlbGVtX2dldF9wbGF5YmFja192b2x1bWUoZWxlbSwgY2huLCAmcHZvbCk7CisJCQkJCQkJcHJpbnRmKCIgJXMiLCBnZXRfcGVyY2VudChwdm9sLCBwbWluLCBwbWF4KSk7CisJCQkJCQkJaWYgKCFzbmRfbWl4ZXJfc2VsZW1fZ2V0X3BsYXliYWNrX2RCKGVsZW0sIGNobiwgJmRiKSkgeworCQkJCQkJCQlwcmludGYoIiBbIik7CisJCQkJCQkJCXByaW50X2RCKGRiKTsKKwkJCQkJCQkJcHJpbnRmKCJdIik7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmICghc25kX21peGVyX3NlbGVtX2hhc19jb21tb25fc3dpdGNoKGVsZW0pKSB7CisJCQkJCQlpZiAoc25kX21peGVyX3NlbGVtX2hhc19wbGF5YmFja19zd2l0Y2goZWxlbSkpIHsKKwkJCQkJCQlpZiAoIXRpdGxlKQorCQkJCQkJCQlwcmludGYoIiBQbGF5YmFjayIpOworCQkJCQkJCXNuZF9taXhlcl9zZWxlbV9nZXRfcGxheWJhY2tfc3dpdGNoKGVsZW0sIGNobiwgJnBzdyk7CisJCQkJCQkJcHJpbnRmKCIgWyVzXSIsIHBzdyA/ICJvbiIgOiAib2ZmIik7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKCFjbW9ubyAmJiBzbmRfbWl4ZXJfc2VsZW1faGFzX2NhcHR1cmVfY2hhbm5lbChlbGVtLCBjaG4pKSB7CisJCQkJCWludCB0aXRsZSA9IDA7CisJCQkJCWlmICghc25kX21peGVyX3NlbGVtX2hhc19jb21tb25fdm9sdW1lKGVsZW0pKSB7CisJCQkJCQlpZiAoc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3ZvbHVtZShlbGVtKSkgeworCQkJCQkJCXByaW50ZigiIENhcHR1cmUiKTsKKwkJCQkJCQl0aXRsZSA9IDE7CisJCQkJCQkJc25kX21peGVyX3NlbGVtX2dldF9jYXB0dXJlX3ZvbHVtZShlbGVtLCBjaG4sICZjdm9sKTsKKwkJCQkJCQlwcmludGYoIiAlcyIsIGdldF9wZXJjZW50KGN2b2wsIGNtaW4sIGNtYXgpKTsKKwkJCQkJCQlpZiAoIXNuZF9taXhlcl9zZWxlbV9nZXRfY2FwdHVyZV9kQihlbGVtLCBjaG4sICZkYikpIHsKKwkJCQkJCQkJcHJpbnRmKCIgWyIpOworCQkJCQkJCQlwcmludF9kQihkYik7CisJCQkJCQkJCXByaW50ZigiXSIpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoIXNuZF9taXhlcl9zZWxlbV9oYXNfY29tbW9uX3N3aXRjaChlbGVtKSkgeworCQkJCQkJaWYgKHNuZF9taXhlcl9zZWxlbV9oYXNfY2FwdHVyZV9zd2l0Y2goZWxlbSkpIHsKKwkJCQkJCQlpZiAoIXRpdGxlKQorCQkJCQkJCQlwcmludGYoIiBDYXB0dXJlIik7CisJCQkJCQkJc25kX21peGVyX3NlbGVtX2dldF9jYXB0dXJlX3N3aXRjaChlbGVtLCBjaG4sICZjc3cpOworCQkJCQkJCXByaW50ZigiIFslc10iLCBjc3cgPyAib24iIDogIm9mZiIpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCXByaW50ZigiXG4iKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZWxlbXMoaW50IGxldmVsKQoreworCWludCBlcnI7CisJc25kX21peGVyX3QgKmhhbmRsZTsKKwlzbmRfbWl4ZXJfc2VsZW1faWRfdCAqc2lkOworCXNuZF9taXhlcl9lbGVtX3QgKmVsZW07CisJc25kX21peGVyX3NlbGVtX2lkX2FsbG9jYSgmc2lkKTsKKwkKKwlpZiAoKGVyciA9IHNuZF9taXhlcl9vcGVuKCZoYW5kbGUsIDApKSA8IDApIHsKKwkJZXJyb3IoIk1peGVyICVzIG9wZW4gZXJyb3I6ICVzIiwgY2FyZCwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gZXJyOworCX0KKwlpZiAoc21peGVyX2xldmVsID09IDAgJiYgKGVyciA9IHNuZF9taXhlcl9hdHRhY2goaGFuZGxlLCBjYXJkKSkgPCAwKSB7CisJCWVycm9yKCJNaXhlciBhdHRhY2ggJXMgZXJyb3I6ICVzIiwgY2FyZCwgc25kX3N0cmVycm9yKGVycikpOworCQlzbmRfbWl4ZXJfY2xvc2UoaGFuZGxlKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKChlcnIgPSBzbmRfbWl4ZXJfc2VsZW1fcmVnaXN0ZXIoaGFuZGxlLCBzbWl4ZXJfbGV2ZWwgPiAwID8gJnNtaXhlcl9vcHRpb25zIDogTlVMTCwgTlVMTCkpIDwgMCkgeworCQllcnJvcigiTWl4ZXIgcmVnaXN0ZXIgZXJyb3I6ICVzIiwgc25kX3N0cmVycm9yKGVycikpOworCQlzbmRfbWl4ZXJfY2xvc2UoaGFuZGxlKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJZXJyID0gc25kX21peGVyX2xvYWQoaGFuZGxlKTsKKwlpZiAoZXJyIDwgMCkgeworCQllcnJvcigiTWl4ZXIgJXMgbG9hZCBlcnJvcjogJXMiLCBjYXJkLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCXNuZF9taXhlcl9jbG9zZShoYW5kbGUpOworCQlyZXR1cm4gZXJyOworCX0KKwlmb3IgKGVsZW0gPSBzbmRfbWl4ZXJfZmlyc3RfZWxlbShoYW5kbGUpOyBlbGVtOyBlbGVtID0gc25kX21peGVyX2VsZW1fbmV4dChlbGVtKSkgeworCQlzbmRfbWl4ZXJfc2VsZW1fZ2V0X2lkKGVsZW0sIHNpZCk7CisJCWlmICghKGxldmVsICYgTEVWRUxfSU5BQ1RJVkUpICYmICFzbmRfbWl4ZXJfc2VsZW1faXNfYWN0aXZlKGVsZW0pKQorCQkJY29udGludWU7CisJCXByaW50ZigiU2ltcGxlIG1peGVyIGNvbnRyb2wgJyVzJywlaVxuIiwgc25kX21peGVyX3NlbGVtX2lkX2dldF9uYW1lKHNpZCksIHNuZF9taXhlcl9zZWxlbV9pZF9nZXRfaW5kZXgoc2lkKSk7CisJCXNob3dfc2VsZW0oaGFuZGxlLCBzaWQsICIgICIsIGxldmVsKTsKKwl9CisJc25kX21peGVyX2Nsb3NlKGhhbmRsZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfY29udHJvbF9pZChjb25zdCBjaGFyICpzdHIsIHNuZF9jdGxfZWxlbV9pZF90ICppZCkKK3sKKwlpbnQgYywgc2l6ZSwgbnVtaWQ7CisJY2hhciAqcHRyOworCisJd2hpbGUgKCpzdHIgPT0gJyAnIHx8ICpzdHIgPT0gJ1x0JykKKwkJc3RyKys7CisJaWYgKCEoKnN0cikpCisJCXJldHVybiAtRUlOVkFMOworCXNuZF9jdGxfZWxlbV9pZF9zZXRfaW50ZXJmYWNlKGlkLCBTTkRfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIpOwkvKiBkZWZhdWx0ICovCisJd2hpbGUgKCpzdHIpIHsKKwkJaWYgKCFzdHJuY2FzZWNtcChzdHIsICJudW1pZD0iLCA2KSkgeworCQkJc3RyICs9IDY7CisJCQludW1pZCA9IGF0b2koc3RyKTsKKwkJCWlmIChudW1pZCA8PSAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJhbWl4ZXI6IEludmFsaWQgbnVtaWQgJWRcbiIsIG51bWlkKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCXNuZF9jdGxfZWxlbV9pZF9zZXRfbnVtaWQoaWQsIGF0b2koc3RyKSk7CisJCQl3aGlsZSAoaXNkaWdpdCgqc3RyKSkKKwkJCQlzdHIrKzsKKwkJfSBlbHNlIGlmICghc3RybmNhc2VjbXAoc3RyLCAiaWZhY2U9IiwgNikpIHsKKwkJCXN0ciArPSA2OworCQkJaWYgKCFzdHJuY2FzZWNtcChzdHIsICJjYXJkIiwgNCkpIHsKKwkJCQlzbmRfY3RsX2VsZW1faWRfc2V0X2ludGVyZmFjZShpZCwgU05EX0NUTF9FTEVNX0lGQUNFX0NBUkQpOworCQkJCXN0ciArPSA0OworCQkJfSBlbHNlIGlmICghc3RybmNhc2VjbXAoc3RyLCAibWl4ZXIiLCA1KSkgeworCQkJCXNuZF9jdGxfZWxlbV9pZF9zZXRfaW50ZXJmYWNlKGlkLCBTTkRfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIpOworCQkJCXN0ciArPSA1OworCQkJfSBlbHNlIGlmICghc3RybmNhc2VjbXAoc3RyLCAicGNtIiwgMykpIHsKKwkJCQlzbmRfY3RsX2VsZW1faWRfc2V0X2ludGVyZmFjZShpZCwgU05EX0NUTF9FTEVNX0lGQUNFX1BDTSk7CisJCQkJc3RyICs9IDM7CisJCQl9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChzdHIsICJyYXdtaWRpIiwgNykpIHsKKwkJCQlzbmRfY3RsX2VsZW1faWRfc2V0X2ludGVyZmFjZShpZCwgU05EX0NUTF9FTEVNX0lGQUNFX1JBV01JREkpOworCQkJCXN0ciArPSA3OworCQkJfSBlbHNlIGlmICghc3RybmNhc2VjbXAoc3RyLCAidGltZXIiLCA1KSkgeworCQkJCXNuZF9jdGxfZWxlbV9pZF9zZXRfaW50ZXJmYWNlKGlkLCBTTkRfQ1RMX0VMRU1fSUZBQ0VfVElNRVIpOworCQkJCXN0ciArPSA1OworCQkJfSBlbHNlIGlmICghc3RybmNhc2VjbXAoc3RyLCAic2VxdWVuY2VyIiwgOSkpIHsKKwkJCQlzbmRfY3RsX2VsZW1faWRfc2V0X2ludGVyZmFjZShpZCwgU05EX0NUTF9FTEVNX0lGQUNFX1NFUVVFTkNFUik7CisJCQkJc3RyICs9IDk7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChzdHIsICJuYW1lPSIsIDUpKSB7CisJCQljaGFyIGJ1Zls2NF07CisJCQlzdHIgKz0gNTsKKwkJCXB0ciA9IGJ1ZjsKKwkJCXNpemUgPSAwOworCQkJaWYgKCpzdHIgPT0gJ1wnJyB8fCAqc3RyID09ICdcIicpIHsKKwkJCQljID0gKnN0cisrOworCQkJCXdoaWxlICgqc3RyICYmICpzdHIgIT0gYykgeworCQkJCQlpZiAoc2l6ZSA8IChpbnQpc2l6ZW9mKGJ1ZikpIHsKKwkJCQkJCSpwdHIrKyA9ICpzdHI7CisJCQkJCQlzaXplKys7CisJCQkJCX0KKwkJCQkJc3RyKys7CisJCQkJfQorCQkJCWlmICgqc3RyID09IGMpCisJCQkJCXN0cisrOworCQkJfSBlbHNlIHsKKwkJCQl3aGlsZSAoKnN0ciAmJiAqc3RyICE9ICcsJykgeworCQkJCQlpZiAoc2l6ZSA8IChpbnQpc2l6ZW9mKGJ1ZikpIHsKKwkJCQkJCSpwdHIrKyA9ICpzdHI7CisJCQkJCQlzaXplKys7CisJCQkJCX0KKwkJCQkJc3RyKys7CisJCQkJfQorCQkJfQorCQkJKnB0ciA9ICdcMCc7CisJCQlzbmRfY3RsX2VsZW1faWRfc2V0X25hbWUoaWQsIGJ1Zik7CisJCX0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKHN0ciwgImluZGV4PSIsIDYpKSB7CisJCQlzdHIgKz0gNjsKKwkJCXNuZF9jdGxfZWxlbV9pZF9zZXRfaW5kZXgoaWQsIGF0b2koc3RyKSk7CisJCQl3aGlsZSAoaXNkaWdpdCgqc3RyKSkKKwkJCQlzdHIrKzsKKwkJfSBlbHNlIGlmICghc3RybmNhc2VjbXAoc3RyLCAiZGV2aWNlPSIsIDcpKSB7CisJCQlzdHIgKz0gNzsKKwkJCXNuZF9jdGxfZWxlbV9pZF9zZXRfZGV2aWNlKGlkLCBhdG9pKHN0cikpOworCQkJd2hpbGUgKGlzZGlnaXQoKnN0cikpCisJCQkJc3RyKys7CisJCX0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKHN0ciwgInN1YmRldmljZT0iLCAxMCkpIHsKKwkJCXN0ciArPSAxMDsKKwkJCXNuZF9jdGxfZWxlbV9pZF9zZXRfc3ViZGV2aWNlKGlkLCBhdG9pKHN0cikpOworCQkJd2hpbGUgKGlzZGlnaXQoKnN0cikpCisJCQkJc3RyKys7CisJCX0KKwkJaWYgKCpzdHIgPT0gJywnKSB7CisJCQlzdHIrKzsKKwkJfSBlbHNlIHsKKwkJCWlmICgqc3RyKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQkJCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX3NpbXBsZV9pZChjb25zdCBjaGFyICpzdHIsIHNuZF9taXhlcl9zZWxlbV9pZF90ICpzaWQpCit7CisJaW50IGMsIHNpemU7CisJY2hhciBidWZbMTI4XTsKKwljaGFyICpwdHIgPSBidWY7CisKKwl3aGlsZSAoKnN0ciA9PSAnICcgfHwgKnN0ciA9PSAnXHQnKQorCQlzdHIrKzsKKwlpZiAoISgqc3RyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc2l6ZSA9IDE7CS8qIGZvciAnXDAnICovCisJaWYgKCpzdHIgIT0gJyInICYmICpzdHIgIT0gJ1wnJykgeworCQl3aGlsZSAoKnN0ciAmJiAqc3RyICE9ICcsJykgeworCQkJaWYgKHNpemUgPCAoaW50KXNpemVvZihidWYpKSB7CisJCQkJKnB0cisrID0gKnN0cjsKKwkJCQlzaXplKys7CisJCQl9CisJCQlzdHIrKzsKKwkJfQorCX0gZWxzZSB7CisJCWMgPSAqc3RyKys7CisJCXdoaWxlICgqc3RyICYmICpzdHIgIT0gYykgeworCQkJaWYgKHNpemUgPCAoaW50KXNpemVvZihidWYpKSB7CisJCQkJKnB0cisrID0gKnN0cjsKKwkJCQlzaXplKys7CisJCQl9CisJCQlzdHIrKzsKKwkJfQorCQlpZiAoKnN0ciA9PSBjKQorCQkJc3RyKys7CisJfQorCWlmICgqc3RyID09ICdcMCcpIHsKKwkJc25kX21peGVyX3NlbGVtX2lkX3NldF9pbmRleChzaWQsIDApOworCQkqcHRyID0gMDsKKwkJZ290byBfc2V0OworCX0KKwlpZiAoKnN0ciAhPSAnLCcpCisJCXJldHVybiAtRUlOVkFMOworCSpwdHIgPSAwOwkvKiB0ZXJtaW5hdGUgdGhlIHN0cmluZyAqLworCXN0cisrOworCWlmICghaXNkaWdpdCgqc3RyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc25kX21peGVyX3NlbGVtX2lkX3NldF9pbmRleChzaWQsIGF0b2koc3RyKSk7CisgICAgICAgX3NldDoKKwlzbmRfbWl4ZXJfc2VsZW1faWRfc2V0X25hbWUoc2lkLCBidWYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9jdGxfZW51bV9pdGVtX2luZGV4KHNuZF9jdGxfdCAqaGFuZGxlLCBzbmRfY3RsX2VsZW1faW5mb190ICppbmZvLAorCQkJCSAgIGNoYXIgKipwdHJwKQoreworCWNoYXIgKnB0ciA9ICpwdHJwOworCWludCBpdGVtcywgaSwgbGVuOworCWNvbnN0IGNoYXIgKm5hbWU7CisJCisJaXRlbXMgPSBzbmRfY3RsX2VsZW1faW5mb19nZXRfaXRlbXMoaW5mbyk7CisJaWYgKGl0ZW1zIDw9IDApCisJCXJldHVybiAtMTsKKworCWZvciAoaSA9IDA7IGkgPCBpdGVtczsgaSsrKSB7CisJCXNuZF9jdGxfZWxlbV9pbmZvX3NldF9pdGVtKGluZm8sIGkpOworCQlpZiAoc25kX2N0bF9lbGVtX2luZm8oaGFuZGxlLCBpbmZvKSA8IDApCisJCQlyZXR1cm4gLTE7CisJCW5hbWUgPSBzbmRfY3RsX2VsZW1faW5mb19nZXRfaXRlbV9uYW1lKGluZm8pOworCQlsZW4gPSBzdHJsZW4obmFtZSk7CisJCWlmICghIHN0cm5jbXAobmFtZSwgcHRyLCBsZW4pKSB7CisJCQlpZiAoISBwdHJbbGVuXSB8fCBwdHJbbGVuXSA9PSAnLCcgfHwgcHRyW2xlbl0gPT0gJ1xuJykgeworCQkJCXB0ciArPSBsZW47CisJCQkJKnB0cnAgPSBwdHI7CisJCQkJcmV0dXJuIGk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGNzZXQoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgaW50IHJvZmxhZywgaW50IGtlZXBfaGFuZGxlKQoreworCWludCBlcnI7CisJc3RhdGljIHNuZF9jdGxfdCAqaGFuZGxlID0gTlVMTDsKKwlzbmRfY3RsX2VsZW1faW5mb190ICppbmZvOworCXNuZF9jdGxfZWxlbV9pZF90ICppZDsKKwlzbmRfY3RsX2VsZW1fdmFsdWVfdCAqY29udHJvbDsKKwljaGFyICpwdHI7CisJdW5zaWduZWQgaW50IGlkeCwgY291bnQ7CisJbG9uZyB0bXA7CisJc25kX2N0bF9lbGVtX3R5cGVfdCB0eXBlOworCXNuZF9jdGxfZWxlbV9pbmZvX2FsbG9jYSgmaW5mbyk7CisJc25kX2N0bF9lbGVtX2lkX2FsbG9jYSgmaWQpOworCXNuZF9jdGxfZWxlbV92YWx1ZV9hbGxvY2EoJmNvbnRyb2wpOworCisJaWYgKGFyZ2MgPCAxKSB7CisJCWZwcmludGYoc3RkZXJyLCAiU3BlY2lmeSBhIGZ1bGwgY29udHJvbCBpZGVudGlmaWVyOiBbW2lmYWNlPTxpZmFjZT4sXVtuYW1lPSduYW1lJyxdW2luZGV4PTxpbmRleD4sXVtkZXZpY2U9PGRldmljZT4sXVtzdWJkZXZpY2U9PHN1YmRldmljZT5dXXxbbnVtaWQ9PG51bWlkPl1cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHBhcnNlX2NvbnRyb2xfaWQoYXJndlswXSwgaWQpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiV3JvbmcgY29udHJvbCBpZGVudGlmaWVyOiAlc1xuIiwgYXJndlswXSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoZGVidWdmbGFnKSB7CisJCXByaW50ZigiVkVSSUZZIElEOiAiKTsKKwkJc2hvd19jb250cm9sX2lkKGlkKTsKKwkJcHJpbnRmKCJcbiIpOworCX0KKwlpZiAoaGFuZGxlID09IE5VTEwgJiYKKwkgICAgKGVyciA9IHNuZF9jdGxfb3BlbigmaGFuZGxlLCBjYXJkLCAwKSkgPCAwKSB7CisJCWVycm9yKCJDb250cm9sICVzIG9wZW4gZXJyb3I6ICVzXG4iLCBjYXJkLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybiBlcnI7CisJfQorCXNuZF9jdGxfZWxlbV9pbmZvX3NldF9pZChpbmZvLCBpZCk7CisJaWYgKChlcnIgPSBzbmRfY3RsX2VsZW1faW5mbyhoYW5kbGUsIGluZm8pKSA8IDApIHsKKwkJaWYgKGlnbm9yZV9lcnJvcikKKwkJCXJldHVybiAwOworCQllcnJvcigiQ2Fubm90IGZpbmQgdGhlIGdpdmVuIGVsZW1lbnQgZnJvbSBjb250cm9sICVzXG4iLCBjYXJkKTsKKwkJaWYgKCEga2VlcF9oYW5kbGUpIHsKKwkJCXNuZF9jdGxfY2xvc2UoaGFuZGxlKTsKKwkJCWhhbmRsZSA9IE5VTEw7CisJCX0KKwkJcmV0dXJuIGVycjsKKwl9CisJc25kX2N0bF9lbGVtX2luZm9fZ2V0X2lkKGluZm8sIGlkKTsJLyogRklYTUU6IFJlbW92ZSBpdCB3aGVuIGhjdGwgZmluZCB3b3JrcyBvayAhISEgKi8KKwl0eXBlID0gc25kX2N0bF9lbGVtX2luZm9fZ2V0X3R5cGUoaW5mbyk7CisJY291bnQgPSBzbmRfY3RsX2VsZW1faW5mb19nZXRfY291bnQoaW5mbyk7CisJc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9pZChjb250cm9sLCBpZCk7CisJCisJaWYgKCFyb2ZsYWcpIHsKKwkJcHRyID0gYXJndlsxXTsKKwkJZm9yIChpZHggPSAwOyBpZHggPCBjb3VudCAmJiBpZHggPCAxMjggJiYgcHRyICYmICpwdHI7IGlkeCsrKSB7CisJCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCWNhc2UgU05EX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjoKKwkJCQl0bXAgPSAwOworCQkJCWlmICghc3RybmNhc2VjbXAocHRyLCAib24iLCAyKSB8fCAhc3RybmNhc2VjbXAocHRyLCAidXAiLCAyKSkgeworCQkJCQl0bXAgPSAxOworCQkJCQlwdHIgKz0gMjsKKwkJCQl9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChwdHIsICJ5ZXMiLCAzKSkgeworCQkJCQl0bXAgPSAxOworCQkJCQlwdHIgKz0gMzsKKwkJCQl9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChwdHIsICJ0b2dnbGUiLCA2KSkgeworCQkJCQl0bXAgPSBzbmRfY3RsX2VsZW1fdmFsdWVfZ2V0X2Jvb2xlYW4oY29udHJvbCwgaWR4KTsKKwkJCQkJdG1wID0gdG1wID4gMCA/IDAgOiAxOworCQkJCQlwdHIgKz0gNjsKKwkJCQl9IGVsc2UgaWYgKGlzZGlnaXQoKnB0cikpIHsKKwkJCQkJdG1wID0gYXRvaShwdHIpID4gMCA/IDEgOiAwOworCQkJCQl3aGlsZSAoaXNkaWdpdCgqcHRyKSkKKwkJCQkJCXB0cisrOworCQkJCX0gZWxzZSB7CisJCQkJCXdoaWxlICgqcHRyICYmICpwdHIgIT0gJywnKQorCQkJCQkJcHRyKys7CisJCQkJfQorCQkJCXNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfYm9vbGVhbihjb250cm9sLCBpZHgsIHRtcCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNORF9DVExfRUxFTV9UWVBFX0lOVEVHRVI6CisJCQkJdG1wID0gZ2V0X2ludGVnZXIoJnB0ciwKKwkJCQkJCSAgc25kX2N0bF9lbGVtX2luZm9fZ2V0X21pbihpbmZvKSwKKwkJCQkJCSAgc25kX2N0bF9lbGVtX2luZm9fZ2V0X21heChpbmZvKSk7CisJCQkJc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9pbnRlZ2VyKGNvbnRyb2wsIGlkeCwgdG1wKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU05EX0NUTF9FTEVNX1RZUEVfSU5URUdFUjY0OgorCQkJCXRtcCA9IGdldF9pbnRlZ2VyNjQoJnB0ciwKKwkJCQkJCSAgc25kX2N0bF9lbGVtX2luZm9fZ2V0X21pbjY0KGluZm8pLAorCQkJCQkJICBzbmRfY3RsX2VsZW1faW5mb19nZXRfbWF4NjQoaW5mbykpOworCQkJCXNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfaW50ZWdlcjY0KGNvbnRyb2wsIGlkeCwgdG1wKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU05EX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDoKKwkJCQl0bXAgPSBnZXRfY3RsX2VudW1faXRlbV9pbmRleChoYW5kbGUsIGluZm8sICZwdHIpOworCQkJCWlmICh0bXAgPCAwKQorCQkJCQl0bXAgPSBnZXRfaW50ZWdlcigmcHRyLCAwLCBzbmRfY3RsX2VsZW1faW5mb19nZXRfaXRlbXMoaW5mbykgLSAxKTsKKwkJCQlzbmRfY3RsX2VsZW1fdmFsdWVfc2V0X2VudW1lcmF0ZWQoY29udHJvbCwgaWR4LCB0bXApOworCQkJCWJyZWFrOworCQkJY2FzZSBTTkRfQ1RMX0VMRU1fVFlQRV9CWVRFUzoKKwkJCQl0bXAgPSBnZXRfaW50ZWdlcigmcHRyLCAwLCAyNTUpOworCQkJCXNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfYnl0ZShjb250cm9sLCBpZHgsIHRtcCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFzdHJjaHIoYXJndlsxXSwgJywnKSkKKwkJCQlwdHIgPSBhcmd2WzFdOworCQkJZWxzZSBpZiAoKnB0ciA9PSAnLCcpCisJCQkJcHRyKys7CisJCX0KKwkJaWYgKChlcnIgPSBzbmRfY3RsX2VsZW1fd3JpdGUoaGFuZGxlLCBjb250cm9sKSkgPCAwKSB7CisJCQlpZiAoIWlnbm9yZV9lcnJvcikKKwkJCQllcnJvcigiQ29udHJvbCAlcyBlbGVtZW50IHdyaXRlIGVycm9yOiAlc1xuIiwgY2FyZCwgc25kX3N0cmVycm9yKGVycikpOworCQkJaWYgKCFrZWVwX2hhbmRsZSkgeworCQkJCXNuZF9jdGxfY2xvc2UoaGFuZGxlKTsKKwkJCQloYW5kbGUgPSBOVUxMOworCQkJfQorCQkJcmV0dXJuIGlnbm9yZV9lcnJvciA/IDAgOiBlcnI7CisJCX0KKwl9CisJaWYgKCEga2VlcF9oYW5kbGUpIHsKKwkJc25kX2N0bF9jbG9zZShoYW5kbGUpOworCQloYW5kbGUgPSBOVUxMOworCX0KKwlpZiAoIXF1aWV0KSB7CisJCXNuZF9oY3RsX3QgKmhjdGw7CisJCXNuZF9oY3RsX2VsZW1fdCAqZWxlbTsKKwkJaWYgKChlcnIgPSBzbmRfaGN0bF9vcGVuKCZoY3RsLCBjYXJkLCAwKSkgPCAwKSB7CisJCQllcnJvcigiQ29udHJvbCAlcyBvcGVuIGVycm9yOiAlc1xuIiwgY2FyZCwgc25kX3N0cmVycm9yKGVycikpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlpZiAoKGVyciA9IHNuZF9oY3RsX2xvYWQoaGN0bCkpIDwgMCkgeworCQkJZXJyb3IoIkNvbnRyb2wgJXMgbG9hZCBlcnJvcjogJXNcbiIsIGNhcmQsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJZWxlbSA9IHNuZF9oY3RsX2ZpbmRfZWxlbShoY3RsLCBpZCk7CisJCWlmIChlbGVtKQorCQkJc2hvd19jb250cm9sKCIgICIsIGVsZW0sIExFVkVMX0JBU0lDIHwgTEVWRUxfSUQpOworCQllbHNlCisJCQlwcmludGYoIkNvdWxkIG5vdCBmaW5kIHRoZSBzcGVjaWZpZWQgZWxlbWVudFxuIik7CisJCXNuZF9oY3RsX2Nsb3NlKGhjdGwpOworCX0KKwlyZXR1cm4gMDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgY2hhbm5lbF9tYXNrIHsKKwljaGFyICpuYW1lOworCXVuc2lnbmVkIGludCBtYXNrOworfSBjaGFubmVsX21hc2tfdDsKK3N0YXRpYyBjb25zdCBjaGFubmVsX21hc2tfdCBjaGFubWFza1tdID0geworCXsiZnJvbnRsZWZ0IiwgMSA8PCBTTkRfTUlYRVJfU0NITl9GUk9OVF9MRUZUfSwKKwl7ImZyb250cmlnaHQiLCAxIDw8IFNORF9NSVhFUl9TQ0hOX0ZST05UX1JJR0hUfSwKKwl7ImZyb250Y2VudGVyIiwgMSA8PCBTTkRfTUlYRVJfU0NITl9GUk9OVF9DRU5URVJ9LAorCXsiZnJvbnQiLCAoKDEgPDwgU05EX01JWEVSX1NDSE5fRlJPTlRfTEVGVCkgfAorCQkgICAoMSA8PCBTTkRfTUlYRVJfU0NITl9GUk9OVF9SSUdIVCkpfSwKKwl7ImNlbnRlciIsIDEgPDwgU05EX01JWEVSX1NDSE5fRlJPTlRfQ0VOVEVSfSwKKwl7InJlYXJsZWZ0IiwgMSA8PCBTTkRfTUlYRVJfU0NITl9SRUFSX0xFRlR9LAorCXsicmVhcnJpZ2h0IiwgMSA8PCBTTkRfTUlYRVJfU0NITl9SRUFSX1JJR0hUfSwKKwl7InJlYXIiLCAoKDEgPDwgU05EX01JWEVSX1NDSE5fUkVBUl9MRUZUKSB8CisJCSAgKDEgPDwgU05EX01JWEVSX1NDSE5fUkVBUl9SSUdIVCkpfSwKKwl7Indvb2ZlciIsIDEgPDwgU05EX01JWEVSX1NDSE5fV09PRkVSfSwKKwl7TlVMTCwgMH0KK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2hhbm5lbHNfbWFzayhjaGFyICoqYXJnLCB1bnNpZ25lZCBpbnQgZGVmKQoreworCWNvbnN0IGNoYW5uZWxfbWFza190ICpjOworCisJZm9yIChjID0gY2hhbm1hc2s7IGMtPm5hbWU7IGMrKykgeworCQlpZiAoc3RybmNhc2VjbXAoKmFyZywgYy0+bmFtZSwgc3RybGVuKGMtPm5hbWUpKSA9PSAwKSB7CisJCQl3aGlsZSAoKiphcmcgIT0gJ1wwJyAmJiAqKmFyZyAhPSAnLCcgJiYgKiphcmcgIT0gJyAnICYmICoqYXJnICE9ICdcdCcpCisJCQkJKCphcmcpKys7CisJCQlpZiAoKiphcmcgPT0gJywnIHx8ICoqYXJnID09ICcgJyB8fCAqKmFyZyA9PSAnXHQnKQorCQkJCSgqYXJnKSsrOworCQkJcmV0dXJuIGMtPm1hc2s7CisJCX0KKwl9CisJcmV0dXJuIGRlZjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBkaXJfbWFzayhjaGFyICoqYXJnLCB1bnNpZ25lZCBpbnQgZGVmKQoreworCWludCBmaW5kZW5kID0gMDsKKworCWlmIChzdHJuY2FzZWNtcCgqYXJnLCAicGxheWJhY2siLCA4KSA9PSAwKQorCQlkZWYgPSBmaW5kZW5kID0gMTsKKwllbHNlIGlmIChzdHJuY2FzZWNtcCgqYXJnLCAiY2FwdHVyZSIsIDgpID09IDApCisJCWRlZiA9IGZpbmRlbmQgPSAyOworCWlmIChmaW5kZW5kKSB7CisJCXdoaWxlICgqKmFyZyAhPSAnXDAnICYmICoqYXJnICE9ICcsJyAmJiAqKmFyZyAhPSAnICcgJiYgKiphcmcgIT0gJ1x0JykKKwkJCSgqYXJnKSsrOworCQlpZiAoKiphcmcgPT0gJywnIHx8ICoqYXJnID09ICcgJyB8fCAqKmFyZyA9PSAnXHQnKQorCQkJKCphcmcpKys7CisJfQorCXJldHVybiBkZWY7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2VudW1faXRlbV9pbmRleChzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBjaGFyICoqcHRycCkKK3sKKwljaGFyICpwdHIgPSAqcHRycDsKKwlpbnQgaXRlbXMsIGksIGxlbjsKKwljaGFyIG5hbWVbNDBdOworCQorCWl0ZW1zID0gc25kX21peGVyX3NlbGVtX2dldF9lbnVtX2l0ZW1zKGVsZW0pOworCWlmIChpdGVtcyA8PSAwKQorCQlyZXR1cm4gLTE7CisKKwlmb3IgKGkgPSAwOyBpIDwgaXRlbXM7IGkrKykgeworCQlpZiAoc25kX21peGVyX3NlbGVtX2dldF9lbnVtX2l0ZW1fbmFtZShlbGVtLCBpLCBzaXplb2YobmFtZSktMSwgbmFtZSkgPCAwKQorCQkJY29udGludWU7CisJCWxlbiA9IHN0cmxlbihuYW1lKTsKKwkJaWYgKCEgc3RybmNtcChuYW1lLCBwdHIsIGxlbikpIHsKKwkJCWlmICghIHB0cltsZW5dIHx8IHB0cltsZW5dID09ICcsJyB8fCBwdHJbbGVuXSA9PSAnXG4nKSB7CisJCQkJcHRyICs9IGxlbjsKKwkJCQkqcHRycCA9IHB0cjsKKwkJCQlyZXR1cm4gaTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgc3NldF9lbnVtKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIHVuc2lnbmVkIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBpbnQgaWR4LCBjaG4gPSAwOworCWludCBjaGVja19mbGFnID0gaWdub3JlX2Vycm9yID8gMCA6IC0xOworCisJZm9yIChpZHggPSAxOyBpZHggPCBhcmdjOyBpZHgrKykgeworCQljaGFyICpwdHIgPSBhcmd2W2lkeF07CisJCXdoaWxlICgqcHRyKSB7CisJCQlpbnQgaXZhbCA9IGdldF9lbnVtX2l0ZW1faW5kZXgoZWxlbSwgJnB0cik7CisJCQlpZiAoaXZhbCA8IDApCisJCQkJcmV0dXJuIGNoZWNrX2ZsYWc7CisJCQlpZiAoc25kX21peGVyX3NlbGVtX3NldF9lbnVtX2l0ZW0oZWxlbSwgY2huLCBpdmFsKSA+PSAwKQorCQkJCWNoZWNrX2ZsYWcgPSAxOworCQkJLyogc2tpcCBzZXBhcmF0b3JzICovCisJCQl3aGlsZSAoKnB0ciA9PSAnLCcgfHwgaXNzcGFjZSgqcHRyKSkKKwkJCQlwdHIrKzsKKwkJfQorCX0KKwlyZXR1cm4gY2hlY2tfZmxhZzsKK30KKworc3RhdGljIGludCBzc2V0X2NoYW5uZWxzKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIHVuc2lnbmVkIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbHMgPSB+MFU7CisJdW5zaWduZWQgaW50IGRpciA9IDMsIG9rZmxhZyA9IDM7CisJdW5zaWduZWQgaW50IGlkeDsKKwlzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNobjsKKwlpbnQgY2hlY2tfZmxhZyA9IGlnbm9yZV9lcnJvciA/IDAgOiAtMTsKKworCWZvciAoaWR4ID0gMTsgaWR4IDwgYXJnYzsgaWR4KyspIHsKKwkJY2hhciAqcHRyID0gYXJndltpZHhdLCAqb3B0cjsKKwkJaW50IG11bHRpLCBmaXJzdGNobiA9IDE7CisJCWNoYW5uZWxzID0gY2hhbm5lbHNfbWFzaygmcHRyLCBjaGFubmVscyk7CisJCWlmICgqcHRyID09ICdcMCcpCisJCQljb250aW51ZTsKKwkJZGlyID0gZGlyX21hc2soJnB0ciwgZGlyKTsKKwkJaWYgKCpwdHIgPT0gJ1wwJykKKwkJCWNvbnRpbnVlOworCQltdWx0aSA9IChzdHJjaHIocHRyLCAnLCcpICE9IE5VTEwpOworCQlvcHRyID0gcHRyOworCQlmb3IgKGNobiA9IDA7IGNobiA8PSBTTkRfTUlYRVJfU0NITl9MQVNUOyBjaG4rKykgeworCQkJY2hhciAqc3B0ciA9IE5VTEw7CisJCQlpbnQgaXZhbDsKKworCQkJaWYgKCEoY2hhbm5lbHMgJiAoMSA8PCBjaG4pKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKChkaXIgJiAxKSAmJiBzbmRfbWl4ZXJfc2VsZW1faGFzX3BsYXliYWNrX2NoYW5uZWwoZWxlbSwgY2huKSkgeworCQkJCXNwdHIgPSBwdHI7CisJCQkJaWYgKCFzdHJuY21wKHB0ciwgIm11dGUiLCA0KSAmJiBzbmRfbWl4ZXJfc2VsZW1faGFzX3BsYXliYWNrX3N3aXRjaChlbGVtKSkgeworCQkJCQlzbmRfbWl4ZXJfc2VsZW1fZ2V0X3BsYXliYWNrX3N3aXRjaChlbGVtLCBjaG4sICZpdmFsKTsKKwkJCQkJaWYgKHNuZF9taXhlcl9zZWxlbV9zZXRfcGxheWJhY2tfc3dpdGNoKGVsZW0sIGNobiwgZ2V0X2Jvb2xfc2ltcGxlKCZwdHIsICJtdXRlIiwgMSwgaXZhbCkpID49IDApCisJCQkJCQljaGVja19mbGFnID0gMTsKKwkJCQl9IGVsc2UgaWYgKCFzdHJuY21wKHB0ciwgIm9mZiIsIDMpICYmIHNuZF9taXhlcl9zZWxlbV9oYXNfcGxheWJhY2tfc3dpdGNoKGVsZW0pKSB7CisJCQkJCXNuZF9taXhlcl9zZWxlbV9nZXRfcGxheWJhY2tfc3dpdGNoKGVsZW0sIGNobiwgJml2YWwpOworCQkJCQlpZiAoc25kX21peGVyX3NlbGVtX3NldF9wbGF5YmFja19zd2l0Y2goZWxlbSwgY2huLCBnZXRfYm9vbF9zaW1wbGUoJnB0ciwgIm9mZiIsIDEsIGl2YWwpKSA+PSAwKQorCQkJCQkJY2hlY2tfZmxhZyA9IDE7CisJCQkJfSBlbHNlIGlmICghc3RybmNtcChwdHIsICJ1bm11dGUiLCA2KSAmJiBzbmRfbWl4ZXJfc2VsZW1faGFzX3BsYXliYWNrX3N3aXRjaChlbGVtKSkgeworCQkJCQlzbmRfbWl4ZXJfc2VsZW1fZ2V0X3BsYXliYWNrX3N3aXRjaChlbGVtLCBjaG4sICZpdmFsKTsKKwkJCQkJaWYgKHNuZF9taXhlcl9zZWxlbV9zZXRfcGxheWJhY2tfc3dpdGNoKGVsZW0sIGNobiwgZ2V0X2Jvb2xfc2ltcGxlKCZwdHIsICJ1bm11dGUiLCAwLCBpdmFsKSkgPj0gMCkKKwkJCQkJCWNoZWNrX2ZsYWcgPSAxOworCQkJCX0gZWxzZSBpZiAoIXN0cm5jbXAocHRyLCAib24iLCAyKSAmJiBzbmRfbWl4ZXJfc2VsZW1faGFzX3BsYXliYWNrX3N3aXRjaChlbGVtKSkgeworCQkJCQlzbmRfbWl4ZXJfc2VsZW1fZ2V0X3BsYXliYWNrX3N3aXRjaChlbGVtLCBjaG4sICZpdmFsKTsKKwkJCQkJaWYgKHNuZF9taXhlcl9zZWxlbV9zZXRfcGxheWJhY2tfc3dpdGNoKGVsZW0sIGNobiwgZ2V0X2Jvb2xfc2ltcGxlKCZwdHIsICJvbiIsIDAsIGl2YWwpKSA+PSAwKQorCQkJCQkJY2hlY2tfZmxhZyA9IDE7CisJCQkJfSBlbHNlIGlmICghc3RybmNtcChwdHIsICJ0b2dnbGUiLCA2KSAmJiBzbmRfbWl4ZXJfc2VsZW1faGFzX3BsYXliYWNrX3N3aXRjaChlbGVtKSkgeworCQkJCQlpZiAoZmlyc3RjaG4gfHwgIXNuZF9taXhlcl9zZWxlbV9oYXNfcGxheWJhY2tfc3dpdGNoX2pvaW5lZChlbGVtKSkgeworCQkJCQkJc25kX21peGVyX3NlbGVtX2dldF9wbGF5YmFja19zd2l0Y2goZWxlbSwgY2huLCAmaXZhbCk7CisJCQkJCQlpZiAoc25kX21peGVyX3NlbGVtX3NldF9wbGF5YmFja19zd2l0Y2goZWxlbSwgY2huLCAoaXZhbCA/IDEgOiAwKSBeIDEpID49IDApCisJCQkJCQkJY2hlY2tfZmxhZyA9IDE7CisJCQkJCX0KKwkJCQkJc2ltcGxlX3NraXBfd29yZCgmcHRyLCAidG9nZ2xlIik7CisJCQkJfSBlbHNlIGlmIChpc2RpZ2l0KCpwdHIpIHx8ICpwdHIgPT0gJy0nIHx8ICpwdHIgPT0gJysnKSB7CisJCQkJCWlmIChzZXRfdm9sdW1lX3NpbXBsZShlbGVtLCBjaG4sICZwdHIsIDApID49IDApCisJCQkJCQljaGVja19mbGFnID0gMTsKKwkJCQl9IGVsc2UgaWYgKHNpbXBsZV9za2lwX3dvcmQoJnB0ciwgImNhcCIpIHx8IHNpbXBsZV9za2lwX3dvcmQoJnB0ciwgInJlYyIpIHx8CisJCQkJCSAgIHNpbXBsZV9za2lwX3dvcmQoJnB0ciwgIm5vY2FwIikgfHwgc2ltcGxlX3NraXBfd29yZCgmcHRyLCAibm9yZWMiKSkgeworCQkJCQkvKiBub3RoaW5nICovCisJCQkJfSBlbHNlIHsKKwkJCQkJb2tmbGFnICY9IH4xOworCQkJCX0KKwkJCX0KKwkJCWlmICgoZGlyICYgMikgJiYgc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX2NoYW5uZWwoZWxlbSwgY2huKSkgeworCQkJCWlmIChzcHRyICE9IE5VTEwpCisJCQkJCXB0ciA9IHNwdHI7CisJCQkJc3B0ciA9IHB0cjsKKwkJCQlpZiAoIXN0cm5jbXAocHRyLCAiY2FwIiwgMykgJiYgc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3N3aXRjaChlbGVtKSkgeworCQkJCQlzbmRfbWl4ZXJfc2VsZW1fZ2V0X2NhcHR1cmVfc3dpdGNoKGVsZW0sIGNobiwgJml2YWwpOworCQkJCQlpZiAoc25kX21peGVyX3NlbGVtX3NldF9jYXB0dXJlX3N3aXRjaChlbGVtLCBjaG4sIGdldF9ib29sX3NpbXBsZSgmcHRyLCAiY2FwIiwgMCwgaXZhbCkpID49IDApCisJCQkJCQljaGVja19mbGFnID0gMTsKKwkJCQl9IGVsc2UgaWYgKCFzdHJuY21wKHB0ciwgInJlYyIsIDMpICYmIHNuZF9taXhlcl9zZWxlbV9oYXNfY2FwdHVyZV9zd2l0Y2goZWxlbSkpIHsKKwkJCQkJc25kX21peGVyX3NlbGVtX2dldF9jYXB0dXJlX3N3aXRjaChlbGVtLCBjaG4sICZpdmFsKTsKKwkJCQkJaWYgKHNuZF9taXhlcl9zZWxlbV9zZXRfY2FwdHVyZV9zd2l0Y2goZWxlbSwgY2huLCBnZXRfYm9vbF9zaW1wbGUoJnB0ciwgInJlYyIsIDAsIGl2YWwpKSA+PSAwKQorCQkJCQkJY2hlY2tfZmxhZyA9IDE7CisJCQkJfSBlbHNlIGlmICghc3RybmNtcChwdHIsICJub2NhcCIsIDUpICYmIHNuZF9taXhlcl9zZWxlbV9oYXNfY2FwdHVyZV9zd2l0Y2goZWxlbSkpIHsKKwkJCQkJc25kX21peGVyX3NlbGVtX2dldF9jYXB0dXJlX3N3aXRjaChlbGVtLCBjaG4sICZpdmFsKTsKKwkJCQkJaWYgKHNuZF9taXhlcl9zZWxlbV9zZXRfY2FwdHVyZV9zd2l0Y2goZWxlbSwgY2huLCBnZXRfYm9vbF9zaW1wbGUoJnB0ciwgIm5vY2FwIiwgMSwgaXZhbCkpID49IDApCisJCQkJCQljaGVja19mbGFnID0gMTsKKwkJCQl9IGVsc2UgaWYgKCFzdHJuY21wKHB0ciwgIm5vcmVjIiwgNSkgJiYgc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3N3aXRjaChlbGVtKSkgeworCQkJCQlzbmRfbWl4ZXJfc2VsZW1fZ2V0X2NhcHR1cmVfc3dpdGNoKGVsZW0sIGNobiwgJml2YWwpOworCQkJCQlpZiAoc25kX21peGVyX3NlbGVtX3NldF9jYXB0dXJlX3N3aXRjaChlbGVtLCBjaG4sIGdldF9ib29sX3NpbXBsZSgmcHRyLCAibm9yZWMiLCAxLCBpdmFsKSkgPj0gMCkKKwkJCQkJCWNoZWNrX2ZsYWcgPSAxOworCQkJCX0gZWxzZSBpZiAoIXN0cm5jbXAocHRyLCAidG9nZ2xlIiwgNikgJiYgc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3N3aXRjaChlbGVtKSkgeworCQkJCQlpZiAoZmlyc3RjaG4gfHwgIXNuZF9taXhlcl9zZWxlbV9oYXNfY2FwdHVyZV9zd2l0Y2hfam9pbmVkKGVsZW0pKSB7CisJCQkJCQlzbmRfbWl4ZXJfc2VsZW1fZ2V0X2NhcHR1cmVfc3dpdGNoKGVsZW0sIGNobiwgJml2YWwpOworCQkJCQkJaWYgKHNuZF9taXhlcl9zZWxlbV9zZXRfY2FwdHVyZV9zd2l0Y2goZWxlbSwgY2huLCAoaXZhbCA/IDEgOiAwKSBeIDEpID49IDApCisJCQkJCQkJY2hlY2tfZmxhZyA9IDE7CisJCQkJCX0KKwkJCQkJc2ltcGxlX3NraXBfd29yZCgmcHRyLCAidG9nZ2xlIik7CisJCQkJfSBlbHNlIGlmIChpc2RpZ2l0KCpwdHIpIHx8ICpwdHIgPT0gJy0nIHx8ICpwdHIgPT0gJysnKSB7CisJCQkJCWlmIChzZXRfdm9sdW1lX3NpbXBsZShlbGVtLCBjaG4sICZwdHIsIDEpID49IDApCisJCQkJCQljaGVja19mbGFnID0gMTsKKwkJCQl9IGVsc2UgaWYgKHNpbXBsZV9za2lwX3dvcmQoJnB0ciwgIm11dGUiKSB8fCBzaW1wbGVfc2tpcF93b3JkKCZwdHIsICJvZmYiKSB8fAorCQkJCQkgICBzaW1wbGVfc2tpcF93b3JkKCZwdHIsICJ1bm11dGUiKSB8fCBzaW1wbGVfc2tpcF93b3JkKCZwdHIsICJvbiIpKSB7CisJCQkJCS8qIG5vdGhpbmcgKi8KKwkJCQl9IGVsc2UgeworCQkJCQlva2ZsYWcgJj0gfjI7CisJCQkJfQorCQkJfQorCQkJaWYgKG9rZmxhZyA9PSAwKSB7CisJCQkJaWYgKGRlYnVnZmxhZykgeworCQkJCQlpZiAoZGlyICYgMSkKKwkJCQkJCWVycm9yKCJVbmtub3duIHBsYXliYWNrIHNldHVwICclcycuLiIsIHB0cik7CisJCQkJCWlmIChkaXIgJiAyKQorCQkJCQkJZXJyb3IoIlVua25vd24gY2FwdHVyZSBzZXR1cCAnJXMnLi4iLCBwdHIpOworCQkJCX0KKwkJCQlyZXR1cm4gMDsgLyoganVzdCBza2lwIGl0ICovCisJCQl9CisJCQlpZiAoIW11bHRpKQorCQkJCXB0ciA9IG9wdHI7CisJCQlmaXJzdGNobiA9IDA7CisJCX0KKwl9CisJcmV0dXJuIGNoZWNrX2ZsYWc7Cit9CisKK3N0YXRpYyBpbnQgc3NldCh1bnNpZ25lZCBpbnQgYXJnYywgY2hhciAqYXJndltdLCBpbnQgcm9mbGFnLCBpbnQga2VlcF9oYW5kbGUpCit7CisJaW50IGVyciA9IDA7CisJc3RhdGljIHNuZF9taXhlcl90ICpoYW5kbGUgPSBOVUxMOworCXNuZF9taXhlcl9lbGVtX3QgKmVsZW07CisJc25kX21peGVyX3NlbGVtX2lkX3QgKnNpZDsKKwlzbmRfbWl4ZXJfc2VsZW1faWRfYWxsb2NhKCZzaWQpOworCisJaWYgKGFyZ2MgPCAxKSB7CisJCWZwcmludGYoc3RkZXJyLCAiU3BlY2lmeSBhIHNjb250cm9sIGlkZW50aWZpZXI6ICduYW1lJyxpbmRleFxuIik7CisJCXJldHVybiAxOworCX0KKwlpZiAocGFyc2Vfc2ltcGxlX2lkKGFyZ3ZbMF0sIHNpZCkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJXcm9uZyBzY29udHJvbCBpZGVudGlmaWVyOiAlc1xuIiwgYXJndlswXSk7CisJCXJldHVybiAxOworCX0KKwlpZiAoIXJvZmxhZyAmJiBhcmdjIDwgMikgeworCQlmcHJpbnRmKHN0ZGVyciwgIlNwZWNpZnkgd2hhdCB5b3Ugd2FudCB0byBzZXQuLi5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKGhhbmRsZSA9PSBOVUxMKSB7CisJCWlmICgoZXJyID0gc25kX21peGVyX29wZW4oJmhhbmRsZSwgMCkpIDwgMCkgeworCQkJZXJyb3IoIk1peGVyICVzIG9wZW4gZXJyb3I6ICVzXG4iLCBjYXJkLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWlmIChzbWl4ZXJfbGV2ZWwgPT0gMCAmJiAoZXJyID0gc25kX21peGVyX2F0dGFjaChoYW5kbGUsIGNhcmQpKSA8IDApIHsKKwkJCWVycm9yKCJNaXhlciBhdHRhY2ggJXMgZXJyb3I6ICVzIiwgY2FyZCwgc25kX3N0cmVycm9yKGVycikpOworCQkJc25kX21peGVyX2Nsb3NlKGhhbmRsZSk7CisJCQloYW5kbGUgPSBOVUxMOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlpZiAoKGVyciA9IHNuZF9taXhlcl9zZWxlbV9yZWdpc3RlcihoYW5kbGUsIHNtaXhlcl9sZXZlbCA+IDAgPyAmc21peGVyX29wdGlvbnMgOiBOVUxMLCBOVUxMKSkgPCAwKSB7CisJCQllcnJvcigiTWl4ZXIgcmVnaXN0ZXIgZXJyb3I6ICVzIiwgc25kX3N0cmVycm9yKGVycikpOworCQkJc25kX21peGVyX2Nsb3NlKGhhbmRsZSk7CisJCQloYW5kbGUgPSBOVUxMOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQllcnIgPSBzbmRfbWl4ZXJfbG9hZChoYW5kbGUpOworCQlpZiAoZXJyIDwgMCkgeworCQkJZXJyb3IoIk1peGVyICVzIGxvYWQgZXJyb3I6ICVzIiwgY2FyZCwgc25kX3N0cmVycm9yKGVycikpOworCQkJc25kX21peGVyX2Nsb3NlKGhhbmRsZSk7CisJCQloYW5kbGUgPSBOVUxMOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKwllbGVtID0gc25kX21peGVyX2ZpbmRfc2VsZW0oaGFuZGxlLCBzaWQpOworCWlmICghZWxlbSkgeworCQlpZiAoaWdub3JlX2Vycm9yKQorCQkJcmV0dXJuIDA7CisJCWVycm9yKCJVbmFibGUgdG8gZmluZCBzaW1wbGUgY29udHJvbCAnJXMnLCVpXG4iLCBzbmRfbWl4ZXJfc2VsZW1faWRfZ2V0X25hbWUoc2lkKSwgc25kX21peGVyX3NlbGVtX2lkX2dldF9pbmRleChzaWQpKTsKKwkJc25kX21peGVyX2Nsb3NlKGhhbmRsZSk7CisJCWhhbmRsZSA9IE5VTEw7CisJCXJldHVybiAtRU5PRU5UOworCX0KKwlpZiAoIXJvZmxhZykgeworCQkvKiBlbnVtIGNvbnRyb2wgKi8KKwkJaWYgKHNuZF9taXhlcl9zZWxlbV9pc19lbnVtZXJhdGVkKGVsZW0pKQorCQkJZXJyID0gc3NldF9lbnVtKGVsZW0sIGFyZ2MsIGFyZ3YpOworCQllbHNlCisJCQllcnIgPSBzc2V0X2NoYW5uZWxzKGVsZW0sIGFyZ2MsIGFyZ3YpOworCisJCWlmICghZXJyKQorCQkJZ290byBkb25lOworCQlpZiAoZXJyIDwgMCkgeworCQkJZXJyb3IoIkludmFsaWQgY29tbWFuZCEiKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKwlpZiAoIXF1aWV0KSB7CisJCXByaW50ZigiU2ltcGxlIG1peGVyIGNvbnRyb2wgJyVzJywlaVxuIiwgc25kX21peGVyX3NlbGVtX2lkX2dldF9uYW1lKHNpZCksIHNuZF9taXhlcl9zZWxlbV9pZF9nZXRfaW5kZXgoc2lkKSk7CisJCXNob3dfc2VsZW0oaGFuZGxlLCBzaWQsICIgICIsIDEpOworCX0KKyBkb25lOgorCWlmICghIGtlZXBfaGFuZGxlKSB7CisJCXNuZF9taXhlcl9jbG9zZShoYW5kbGUpOworCQloYW5kbGUgPSBOVUxMOworCX0KKwlyZXR1cm4gZXJyIDwgMCA/IDEgOiAwOworfQorCitzdGF0aWMgdm9pZCBldmVudHNfaW5mbyhzbmRfaGN0bF9lbGVtX3QgKmhlbGVtKQoreworCXNuZF9jdGxfZWxlbV9pZF90ICppZDsKKwlzbmRfY3RsX2VsZW1faWRfYWxsb2NhKCZpZCk7CisJc25kX2hjdGxfZWxlbV9nZXRfaWQoaGVsZW0sIGlkKTsKKwlwcmludGYoImV2ZW50IGluZm86ICIpOworCXNob3dfY29udHJvbF9pZChpZCk7CisJcHJpbnRmKCJcbiIpOworfQorCitzdGF0aWMgdm9pZCBldmVudHNfdmFsdWUoc25kX2hjdGxfZWxlbV90ICpoZWxlbSkKK3sKKwlzbmRfY3RsX2VsZW1faWRfdCAqaWQ7CisJc25kX2N0bF9lbGVtX2lkX2FsbG9jYSgmaWQpOworCXNuZF9oY3RsX2VsZW1fZ2V0X2lkKGhlbGVtLCBpZCk7CisJcHJpbnRmKCJldmVudCB2YWx1ZTogIik7CisJc2hvd19jb250cm9sX2lkKGlkKTsKKwlwcmludGYoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGV2ZW50c19yZW1vdmUoc25kX2hjdGxfZWxlbV90ICpoZWxlbSkKK3sKKwlzbmRfY3RsX2VsZW1faWRfdCAqaWQ7CisJc25kX2N0bF9lbGVtX2lkX2FsbG9jYSgmaWQpOworCXNuZF9oY3RsX2VsZW1fZ2V0X2lkKGhlbGVtLCBpZCk7CisJcHJpbnRmKCJldmVudCByZW1vdmU6ICIpOworCXNob3dfY29udHJvbF9pZChpZCk7CisJcHJpbnRmKCJcbiIpOworfQorCitzdGF0aWMgaW50IGVsZW1lbnRfY2FsbGJhY2soc25kX2hjdGxfZWxlbV90ICplbGVtLCB1bnNpZ25lZCBpbnQgbWFzaykKK3sKKwlpZiAobWFzayA9PSBTTkRfQ1RMX0VWRU5UX01BU0tfUkVNT1ZFKSB7CisJCWV2ZW50c19yZW1vdmUoZWxlbSk7CisJCXJldHVybiAwOworCX0KKwlpZiAobWFzayAmIFNORF9DVExfRVZFTlRfTUFTS19JTkZPKSAKKwkJZXZlbnRzX2luZm8oZWxlbSk7CisJaWYgKG1hc2sgJiBTTkRfQ1RMX0VWRU5UX01BU0tfVkFMVUUpIAorCQlldmVudHNfdmFsdWUoZWxlbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV2ZW50c19hZGQoc25kX2hjdGxfZWxlbV90ICpoZWxlbSkKK3sKKwlzbmRfY3RsX2VsZW1faWRfdCAqaWQ7CisJc25kX2N0bF9lbGVtX2lkX2FsbG9jYSgmaWQpOworCXNuZF9oY3RsX2VsZW1fZ2V0X2lkKGhlbGVtLCBpZCk7CisJcHJpbnRmKCJldmVudCBhZGQ6ICIpOworCXNob3dfY29udHJvbF9pZChpZCk7CisJcHJpbnRmKCJcbiIpOworCXNuZF9oY3RsX2VsZW1fc2V0X2NhbGxiYWNrKGhlbGVtLCBlbGVtZW50X2NhbGxiYWNrKTsKK30KKworc3RhdGljIGludCBjdGxfY2FsbGJhY2soc25kX2hjdGxfdCAqY3RsLCB1bnNpZ25lZCBpbnQgbWFzaywKKwkJIHNuZF9oY3RsX2VsZW1fdCAqZWxlbSkKK3sKKwlpZiAobWFzayAmIFNORF9DVExfRVZFTlRfTUFTS19BREQpCisJCWV2ZW50c19hZGQoZWxlbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXZlbnRzKGludCBhcmdjIEFUVFJJQlVURV9VTlVTRUQsIGNoYXIgKmFyZ3ZbXSBBVFRSSUJVVEVfVU5VU0VEKQoreworCXNuZF9oY3RsX3QgKmhhbmRsZTsKKwlzbmRfaGN0bF9lbGVtX3QgKmhlbGVtOworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHNuZF9oY3RsX29wZW4oJmhhbmRsZSwgY2FyZCwgMCkpIDwgMCkgeworCQllcnJvcigiQ29udHJvbCAlcyBvcGVuIGVycm9yOiAlc1xuIiwgY2FyZCwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gZXJyOworCX0KKwlzbmRfaGN0bF9zZXRfY2FsbGJhY2soaGFuZGxlLCBjdGxfY2FsbGJhY2spOworCWlmICgoZXJyID0gc25kX2hjdGxfbG9hZChoYW5kbGUpKSA8IDApIHsKKwkJZXJyb3IoIkNvbnRyb2wgJXMgaGJ1aWxkIGVycm9yOiAlc1xuIiwgY2FyZCwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gZXJyOworCX0KKwlmb3IgKGhlbGVtID0gc25kX2hjdGxfZmlyc3RfZWxlbShoYW5kbGUpOyBoZWxlbTsgaGVsZW0gPSBzbmRfaGN0bF9lbGVtX25leHQoaGVsZW0pKSB7CisJCXNuZF9oY3RsX2VsZW1fc2V0X2NhbGxiYWNrKGhlbGVtLCBlbGVtZW50X2NhbGxiYWNrKTsKKwl9CisJcHJpbnRmKCJSZWFkeSB0byBsaXN0ZW4uLi5cbiIpOworCXdoaWxlICgxKSB7CisJCWludCByZXMgPSBzbmRfaGN0bF93YWl0KGhhbmRsZSwgLTEpOworCQlpZiAocmVzID49IDApIHsKKwkJCXByaW50ZigiUG9sbCBvazogJWlcbiIsIHJlcyk7CisJCQlyZXMgPSBzbmRfaGN0bF9oYW5kbGVfZXZlbnRzKGhhbmRsZSk7CisJCQlhc3NlcnQocmVzID4gMCk7CisJCX0KKwl9CisJc25kX2hjdGxfY2xvc2UoaGFuZGxlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2V2ZW50c192YWx1ZShzbmRfbWl4ZXJfc2VsZW1faWRfdCAqc2lkKQoreworCXByaW50ZigiZXZlbnQgdmFsdWU6ICclcycsJWlcbiIsIHNuZF9taXhlcl9zZWxlbV9pZF9nZXRfbmFtZShzaWQpLCBzbmRfbWl4ZXJfc2VsZW1faWRfZ2V0X2luZGV4KHNpZCkpOworfQorCitzdGF0aWMgdm9pZCBzZXZlbnRzX2luZm8oc25kX21peGVyX3NlbGVtX2lkX3QgKnNpZCkKK3sKKwlwcmludGYoImV2ZW50IGluZm86ICclcycsJWlcbiIsIHNuZF9taXhlcl9zZWxlbV9pZF9nZXRfbmFtZShzaWQpLCBzbmRfbWl4ZXJfc2VsZW1faWRfZ2V0X2luZGV4KHNpZCkpOworfQorCitzdGF0aWMgdm9pZCBzZXZlbnRzX3JlbW92ZShzbmRfbWl4ZXJfc2VsZW1faWRfdCAqc2lkKQoreworCXByaW50ZigiZXZlbnQgcmVtb3ZlOiAnJXMnLCVpXG4iLCBzbmRfbWl4ZXJfc2VsZW1faWRfZ2V0X25hbWUoc2lkKSwgc25kX21peGVyX3NlbGVtX2lkX2dldF9pbmRleChzaWQpKTsKK30KKworc3RhdGljIGludCBtZWxlbV9ldmVudChzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCB1bnNpZ25lZCBpbnQgbWFzaykKK3sKKwlzbmRfbWl4ZXJfc2VsZW1faWRfdCAqc2lkOworCXNuZF9taXhlcl9zZWxlbV9pZF9hbGxvY2EoJnNpZCk7CisJc25kX21peGVyX3NlbGVtX2dldF9pZChlbGVtLCBzaWQpOworCWlmIChtYXNrID09IFNORF9DVExfRVZFTlRfTUFTS19SRU1PVkUpIHsKKwkJc2V2ZW50c19yZW1vdmUoc2lkKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChtYXNrICYgU05EX0NUTF9FVkVOVF9NQVNLX0lORk8pIAorCQlzZXZlbnRzX2luZm8oc2lkKTsKKwlpZiAobWFzayAmIFNORF9DVExfRVZFTlRfTUFTS19WQUxVRSkgCisJCXNldmVudHNfdmFsdWUoc2lkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2V2ZW50c19hZGQoc25kX21peGVyX2VsZW1fdCAqZWxlbSkKK3sKKwlzbmRfbWl4ZXJfc2VsZW1faWRfdCAqc2lkOworCXNuZF9taXhlcl9zZWxlbV9pZF9hbGxvY2EoJnNpZCk7CisJc25kX21peGVyX3NlbGVtX2dldF9pZChlbGVtLCBzaWQpOworCXByaW50ZigiZXZlbnQgYWRkOiAnJXMnLCVpXG4iLCBzbmRfbWl4ZXJfc2VsZW1faWRfZ2V0X25hbWUoc2lkKSwgc25kX21peGVyX3NlbGVtX2lkX2dldF9pbmRleChzaWQpKTsKKwlzbmRfbWl4ZXJfZWxlbV9zZXRfY2FsbGJhY2soZWxlbSwgbWVsZW1fZXZlbnQpOworfQorCitzdGF0aWMgaW50IG1peGVyX2V2ZW50KHNuZF9taXhlcl90ICptaXhlciwgdW5zaWduZWQgaW50IG1hc2ssCisJCXNuZF9taXhlcl9lbGVtX3QgKmVsZW0pCit7CisJaWYgKG1hc2sgJiBTTkRfQ1RMX0VWRU5UX01BU0tfQUREKQorCQlzZXZlbnRzX2FkZChlbGVtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXZlbnRzKGludCBhcmdjIEFUVFJJQlVURV9VTlVTRUQsIGNoYXIgKmFyZ3ZbXSBBVFRSSUJVVEVfVU5VU0VEKQoreworCXNuZF9taXhlcl90ICpoYW5kbGU7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gc25kX21peGVyX29wZW4oJmhhbmRsZSwgMCkpIDwgMCkgeworCQllcnJvcigiTWl4ZXIgJXMgb3BlbiBlcnJvcjogJXMiLCBjYXJkLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybiBlcnI7CisJfQorCWlmIChzbWl4ZXJfbGV2ZWwgPT0gMCAmJiAoZXJyID0gc25kX21peGVyX2F0dGFjaChoYW5kbGUsIGNhcmQpKSA8IDApIHsKKwkJZXJyb3IoIk1peGVyIGF0dGFjaCAlcyBlcnJvcjogJXMiLCBjYXJkLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCXNuZF9taXhlcl9jbG9zZShoYW5kbGUpOworCQlyZXR1cm4gZXJyOworCX0KKwlpZiAoKGVyciA9IHNuZF9taXhlcl9zZWxlbV9yZWdpc3RlcihoYW5kbGUsIHNtaXhlcl9sZXZlbCA+IDAgPyAmc21peGVyX29wdGlvbnMgOiBOVUxMLCBOVUxMKSkgPCAwKSB7CisJCWVycm9yKCJNaXhlciByZWdpc3RlciBlcnJvcjogJXMiLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCXNuZF9taXhlcl9jbG9zZShoYW5kbGUpOworCQlyZXR1cm4gZXJyOworCX0KKwlzbmRfbWl4ZXJfc2V0X2NhbGxiYWNrKGhhbmRsZSwgbWl4ZXJfZXZlbnQpOworCWVyciA9IHNuZF9taXhlcl9sb2FkKGhhbmRsZSk7CisJaWYgKGVyciA8IDApIHsKKwkJZXJyb3IoIk1peGVyICVzIGxvYWQgZXJyb3I6ICVzIiwgY2FyZCwgc25kX3N0cmVycm9yKGVycikpOworCQlzbmRfbWl4ZXJfY2xvc2UoaGFuZGxlKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlwcmludGYoIlJlYWR5IHRvIGxpc3Rlbi4uLlxuIik7CisJd2hpbGUgKDEpIHsKKwkJaW50IHJlczsKKwkJcmVzID0gc25kX21peGVyX3dhaXQoaGFuZGxlLCAtMSk7CisJCWlmIChyZXMgPj0gMCkgeworCQkJcHJpbnRmKCJQb2xsIG9rOiAlaVxuIiwgcmVzKTsKKwkJCXJlcyA9IHNuZF9taXhlcl9oYW5kbGVfZXZlbnRzKGhhbmRsZSk7CisJCQlhc3NlcnQocmVzID49IDApOworCQl9CisJfQorCXNuZF9taXhlcl9jbG9zZShoYW5kbGUpOworCXJldHVybiAwOworfQorCisvKgorICogc3BsaXQgYSBsaW5lIGludG8gdG9rZW5zCisgKiB0aGUgY29udGVudCBpbiB0aGUgbGluZSBidWZmZXIgaXMgbW9kaWZpZWQKKyAqLworc3RhdGljIGludCBzcGxpdF9saW5lKGNoYXIgKmJ1ZiwgY2hhciAqKnRva2VuLCBpbnQgbWF4X3Rva2VuKQoreworCWNoYXIgKmRzdDsKKwlpbnQgbiwgZXNjLCBxdW90ZTsKKworCWZvciAobiA9IDA7IG4gPCBtYXhfdG9rZW47IG4rKykgeworCQl3aGlsZSAoaXNzcGFjZSgqYnVmKSkKKwkJCWJ1ZisrOworCQlpZiAoISAqYnVmIHx8ICpidWYgPT0gJ1xuJykKKwkJCXJldHVybiBuOworCQkvKiBza2lwIGNvbW1lbnRzICovCisJCWlmICgqYnVmID09ICcjJyB8fCAqYnVmID09ICchJykKKwkJCXJldHVybiBuOworCQllc2MgPSAwOworCQlxdW90ZSA9IDA7CisJCXRva2VuW25dID0gYnVmOworCQlmb3IgKGRzdCA9IGJ1ZjsgKmJ1ZiAmJiAqYnVmICE9ICdcbic7IGJ1ZisrKSB7CisJCQlpZiAoZXNjKQorCQkJCWVzYyA9IDA7CisJCQllbHNlIGlmIChpc3NwYWNlKCpidWYpICYmICFxdW90ZSkgeworCQkJCWJ1ZisrOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmICgqYnVmID09ICdcXCcpIHsKKwkJCQllc2MgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmICgqYnVmID09ICdcJycgfHwgKmJ1ZiA9PSAnIicpIHsKKwkJCQlpZiAoISBxdW90ZSkgeworCQkJCQlxdW90ZSA9ICpidWY7CisJCQkJCWNvbnRpbnVlOworCQkJCX0gZWxzZSBpZiAoKmJ1ZiA9PSBxdW90ZSkgeworCQkJCQlxdW90ZSA9IDA7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJCSpkc3QrKyA9ICpidWY7CisJCX0KKwkJKmRzdCA9IDA7CisJfQorCXJldHVybiBuOworfQorCisjZGVmaW5lIE1BWF9BUkdTCTMyCisKK3N0YXRpYyBpbnQgZXhlY19zdGRpbih2b2lkKQoreworCWludCBuYXJnOworCWNoYXIgYnVmWzI1Nl0sICphcmdzW01BWF9BUkdTXTsKKwlpbnQgZXJyID0gMDsKKworCS8qIHF1aWV0ID0gMTsgKi8KKwlpZ25vcmVfZXJyb3IgPSAxOworCisJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHN0ZGluKSkgeworCQluYXJnID0gc3BsaXRfbGluZShidWYsIGFyZ3MsIE1BWF9BUkdTKTsKKwkJaWYgKG5hcmcgPiAwKSB7CisJCQlpZiAoIXN0cmNtcChhcmdzWzBdLCAic3NldCIpIHx8ICFzdHJjbXAoYXJnc1swXSwgInNldCIpKQorCQkJCWVyciA9IHNzZXQobmFyZyAtIDEsIGFyZ3MgKyAxLCAwLCAxKTsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoYXJnc1swXSwgImNzZXQiKSkKKwkJCQllcnIgPSBjc2V0KG5hcmcgLSAxLCBhcmdzICsgMSwgMCwgMSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBtb3JlaGVscCwgbGV2ZWwgPSAwOworCWludCByZWFkX3N0ZGluID0gMDsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbltdID0KKwl7CisJCXsiaGVscCIsIDAsIE5VTEwsICdoJ30sCisJCXsiY2FyZCIsIDEsIE5VTEwsICdjJ30sCisJCXsiZGV2aWNlIiwgMSwgTlVMTCwgJ0QnfSwKKwkJeyJxdWlldCIsIDAsIE5VTEwsICdxJ30sCisJCXsiaW5hY3RpdmUiLCAwLCBOVUxMLCAnaSd9LAorCQl7ImRlYnVnIiwgMCwgTlVMTCwgJ2QnfSwKKwkJeyJub2NoZWNrIiwgMCwgTlVMTCwgJ24nfSwKKwkJeyJ2ZXJzaW9uIiwgMCwgTlVMTCwgJ3YnfSwKKwkJeyJhYnN0cmFjdCIsIDEsIE5VTEwsICdhJ30sCisJCXsic3RkaW4iLCAwLCBOVUxMLCAncyd9LAorCQl7TlVMTCwgMCwgTlVMTCwgMH0sCisJfTsKKworCW1vcmVoZWxwID0gMDsKKwl3aGlsZSAoMSkgeworCQlpbnQgYzsKKworCQlpZiAoKGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiaGM6RDpxaWRudmE6cyIsIGxvbmdfb3B0aW9uLCBOVUxMKSkgPCAwKQorCQkJYnJlYWs7CisJCXN3aXRjaCAoYykgeworCQljYXNlICdoJzoKKwkJCWhlbHAoKTsKKwkJCXJldHVybiAwOworCQljYXNlICdjJzoKKwkJCXsKKwkJCQlpbnQgaTsKKwkJCQlpID0gc25kX2NhcmRfZ2V0X2luZGV4KG9wdGFyZyk7CisJCQkJaWYgKGkgPj0gMCAmJiBpIDwgMzIpCisJCQkJCXNwcmludGYoY2FyZCwgImh3OiVpIiwgaSk7CisJCQkJZWxzZSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBjYXJkIG51bWJlci5cbiIpOworCQkJCQltb3JlaGVscCsrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdEJzoKKwkJCXN0cm5jcHkoY2FyZCwgb3B0YXJnLCBzaXplb2YoY2FyZCktMSk7CisJCQljYXJkW3NpemVvZihjYXJkKS0xXSA9ICdcMCc7CisJCQlicmVhazsKKwkJY2FzZSAncSc6CisJCQlxdWlldCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnaSc6CisJCQlsZXZlbCB8PSBMRVZFTF9JTkFDVElWRTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCWRlYnVnZmxhZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnbic6CisJCQlub19jaGVjayA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCQlwcmludGYoImFtaXhlciB2ZXJzaW9uICIgU05EX1VUSUxfVkVSU0lPTl9TVFIgIlxuIik7CisJCQlyZXR1cm4gMTsKKwkJY2FzZSAnYSc6CisJCQlzbWl4ZXJfbGV2ZWwgPSAxOworCQkJbWVtc2V0KCZzbWl4ZXJfb3B0aW9ucywgMCwgc2l6ZW9mKHNtaXhlcl9vcHRpb25zKSk7CisJCQlzbWl4ZXJfb3B0aW9ucy52ZXIgPSAxOworCQkJaWYgKCFzdHJjbXAob3B0YXJnLCAibm9uZSIpKQorCQkJCXNtaXhlcl9vcHRpb25zLmFic3RyYWN0ID0gU05EX01JWEVSX1NBQlNUUkFDVF9OT05FOworCQkJZWxzZSBpZiAoIXN0cmNtcChvcHRhcmcsICJiYXNpYyIpKQorCQkJCXNtaXhlcl9vcHRpb25zLmFic3RyYWN0ID0gU05EX01JWEVSX1NBQlNUUkFDVF9CQVNJQzsKKwkJCWVsc2UgeworCQkJCWZwcmludGYoc3RkZXJyLCAiU2VsZWN0IGNvcnJlY3QgYWJzdHJhY3Rpb24gbGV2ZWwgKG5vbmUgb3IgYmFzaWMpLi4uXG4iKTsKKwkJCQltb3JlaGVscCsrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJcmVhZF9zdGRpbiA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBzd2l0Y2ggb3Igb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LlxuIik7CisJCQltb3JlaGVscCsrOworCQl9CisJfQorCWlmIChtb3JlaGVscCkgeworCQloZWxwKCk7CisJCXJldHVybiAxOworCX0KKwlzbWl4ZXJfb3B0aW9ucy5kZXZpY2UgPSBjYXJkOworCisJaWYgKHJlYWRfc3RkaW4pCisJCXJldHVybiBleGVjX3N0ZGluKCk7CisKKwlpZiAoYXJnYyAtIG9wdGluZCA8PSAwKSB7CisJCXJldHVybiBzZWxlbXMoTEVWRUxfQkFTSUMgfCBsZXZlbCkgPyAxIDogMDsKKwl9CisJaWYgKCFzdHJjbXAoYXJndltvcHRpbmRdLCAiaGVscCIpKSB7CisJCXJldHVybiBoZWxwKCkgPyAxIDogMDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltvcHRpbmRdLCAiaW5mbyIpKSB7CisJCXJldHVybiBpbmZvKCkgPyAxIDogMDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltvcHRpbmRdLCAiY29udHJvbHMiKSkgeworCQlyZXR1cm4gY29udHJvbHMobGV2ZWwpID8gMSA6IDA7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3Zbb3B0aW5kXSwgImNvbnRlbnRzIikpIHsKKwkJcmV0dXJuIGNvbnRyb2xzKExFVkVMX0JBU0lDIHwgbGV2ZWwpID8gMSA6IDA7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3Zbb3B0aW5kXSwgInNjb250cm9scyIpIHx8ICFzdHJjbXAoYXJndltvcHRpbmRdLCAic2ltcGxlIikpIHsKKwkJcmV0dXJuIHNlbGVtcyhsZXZlbCkgPyAxIDogMDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltvcHRpbmRdLCAic2NvbnRlbnRzIikpIHsKKwkJcmV0dXJuIHNlbGVtcyhMRVZFTF9CQVNJQyB8IGxldmVsKSA/IDEgOiAwOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W29wdGluZF0sICJzc2V0IikgfHwgIXN0cmNtcChhcmd2W29wdGluZF0sICJzZXQiKSkgeworCQlyZXR1cm4gc3NldChhcmdjIC0gb3B0aW5kIC0gMSwgYXJnYyAtIG9wdGluZCA+IDEgPyBhcmd2ICsgb3B0aW5kICsgMSA6IE5VTEwsIDAsIDApID8gMSA6IDA7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3Zbb3B0aW5kXSwgInNnZXQiKSB8fCAhc3RyY21wKGFyZ3Zbb3B0aW5kXSwgImdldCIpKSB7CisJCXJldHVybiBzc2V0KGFyZ2MgLSBvcHRpbmQgLSAxLCBhcmdjIC0gb3B0aW5kID4gMSA/IGFyZ3YgKyBvcHRpbmQgKyAxIDogTlVMTCwgMSwgMCkgPyAxIDogMDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltvcHRpbmRdLCAiY3NldCIpKSB7CisJCXJldHVybiBjc2V0KGFyZ2MgLSBvcHRpbmQgLSAxLCBhcmdjIC0gb3B0aW5kID4gMSA/IGFyZ3YgKyBvcHRpbmQgKyAxIDogTlVMTCwgMCwgMCkgPyAxIDogMDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltvcHRpbmRdLCAiY2dldCIpKSB7CisJCXJldHVybiBjc2V0KGFyZ2MgLSBvcHRpbmQgLSAxLCBhcmdjIC0gb3B0aW5kID4gMSA/IGFyZ3YgKyBvcHRpbmQgKyAxIDogTlVMTCwgMSwgMCkgPyAxIDogMDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltvcHRpbmRdLCAiZXZlbnRzIikpIHsKKwkJcmV0dXJuIGV2ZW50cyhhcmdjIC0gb3B0aW5kIC0gMSwgYXJnYyAtIG9wdGluZCA+IDEgPyBhcmd2ICsgb3B0aW5kICsgMSA6IE5VTEwpOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W29wdGluZF0sICJzZXZlbnRzIikpIHsKKwkJcmV0dXJuIHNldmVudHMoYXJnYyAtIG9wdGluZCAtIDEsIGFyZ2MgLSBvcHRpbmQgPiAxID8gYXJndiArIG9wdGluZCArIDEgOiBOVUxMKTsKKwl9IGVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgImFtaXhlcjogVW5rbm93biBjb21tYW5kICclcycuLi5cbiIsIGFyZ3Zbb3B0aW5kXSk7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hbWl4ZXIvYW1peGVyLmggYi9hbWl4ZXIvYW1peGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU4OGYwNAotLS0gL2Rldi9udWxsCisrKyBiL2FtaXhlci9hbWl4ZXIuaApAQCAtMCwwICsxLDIxIEBACisvKgorICogICBBTFNBIGNvbW1hbmQgbGluZSBtaXhlciB1dGlsaXR5CisgKiAgIENvcHlyaWdodCAoYykgMTk5OSBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgIi4uL2luY2x1ZGUvdmVyc2lvbi5oIgpkaWZmIC0tZ2l0IGEvYW1peGVyL2dvIGIvYW1peGVyL2dvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA3MTYyN2YKLS0tIC9kZXYvbnVsbAorKysgYi9hbWl4ZXIvZ28KQEAgLTAsMCArMSwxMCBAQAorIyEvYmluL2Jhc2gKKworI0dEQj0iZ2RiIC0tYXJncyIKK0dEQj0iIgorCitBTFNBX01JWEVSX1NJTVBMRV9NT0RVTEVTPSIkSE9NRS9oZy9hbHNhLWxpYi9tb2R1bGVzL21peGVyL3NpbXBsZS8ubGlicyIgXAorQUxTQV9NSVhFUl9TSU1QTEU9IiRIT01FL2hnL2Fsc2EtbGliL3NyYy9jb25mL3NtaXhlci5jb25mIiBcCitBTFNBX01JWEVSX1NJTVBMRV9NUFlUSE9OPSIkSE9NRS9oZy9hbHNhLWxpYi9tb2R1bGVzL21peGVyL3NpbXBsZS9weXRob24vbWFpbi5weSIgXAorTERfUFJFTE9BRD0iJEhPTUUvaGcvYWxzYS1saWIvc3JjLy5saWJzL2xpYmFzb3VuZC5zbyIgXAorJEdEQiAuL2FtaXhlciAiJEAiCmRpZmYgLS1naXQgYS9hcGxheS9NYWtlZmlsZS5hbSBiL2FwbGF5L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMzIzZDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcGxheS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDMxIEBACitMSUJSVCA9IEBMSUJSVEAKKworSU5DTFVERVMgPSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorTERBREQgPSAkKExJQklOVEwpICQoTElCUlQpCisKKyMgZGVidWcgZmxhZ3MKKyNMREZMQUdTID0gLXN0YXRpYworI0xEQUREICs9IC1sZGwKKworYmluX1BST0dSQU1TID0gYXBsYXkKK21hbl9NQU5TID0gYXBsYXkuMSBhcmVjb3JkLjEKK25vaW5zdF9IRUFERVJTID0gZm9ybWF0cy5oCisKK0VYVFJBX0RJU1QgPSBhcGxheS4xIGFyZWNvcmQuMQorRVhUUkFfQ0xFQU4gPSBhcmVjb3JkCisKK2FyZWNvcmQ6IGFwbGF5CisJcm0gLWYgYXJlY29yZAorCSQoTE5fUykgJDwgJEAKKworYXJlY29yZC4xOiBhcGxheS4xCisJcm0gLWYgYXJlY29yZC4xCisJJChMTl9TKSAkPCAkQAorCitpbnN0YWxsLWV4ZWMtaG9vazogYXJlY29yZAorCXJtIC1mICQoREVTVERJUikkKGJpbmRpcikvYXJlY29yZAorCShjZCAkKERFU1RESVIpJChiaW5kaXIpICYmICQoTE5fUykgYXBsYXkgYXJlY29yZCkKKworaW5zdGFsbC1kYXRhLWhvb2s6CisJcm0gLWYgJChERVNURElSKSQobWFuZGlyKS9tYW4xL2FyZWNvcmQuMQorCShjZCAkKERFU1RESVIpJChtYW5kaXIpL21hbjEgJiYgJChMTl9TKSBhcGxheS4xIGFyZWNvcmQuMSkKZGlmZiAtLWdpdCBhL2FwbGF5L2FwbGF5LjEgYi9hcGxheS9hcGxheS4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjY2Y1NTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGxheS9hcGxheS4xCkBAIC0wLDAgKzEsMjQxIEBACisuVEggQVBMQVkgMSAiMSBKYW51YXJ5IDIwMTAiCisuU0ggTkFNRQorYXJlY29yZCwgYXBsYXkgXC0gY29tbWFuZC1saW5lIHNvdW5kIHJlY29yZGVyIGFuZCBwbGF5ZXIgZm9yIEFMU0EgCitzb3VuZGNhcmQgZHJpdmVyCisuU0ggU1lOT1BTSVMKK1xmQmFyZWNvcmRcZlAgW1xmSWZsYWdzXGZQXSBbZmlsZW5hbWVdCisuYnIKK1xmQmFwbGF5XGZQIFtcZklmbGFnc1xmUF0gW2ZpbGVuYW1lIFtmaWxlbmFtZV1dIC4uLgorCisuU0ggREVTQ1JJUFRJT04KK1xmQmFyZWNvcmRcZlAgaXMgYSBjb21tYW5kLWxpbmUgc291bmRmaWxlIHJlY29yZGVyIGZvciB0aGUgQUxTQSBzb3VuZGNhcmQKK2RyaXZlci4gSXQgc3VwcG9ydHMgc2V2ZXJhbCBmaWxlIGZvcm1hdHMgYW5kIG11bHRpcGxlIHNvdW5kY2FyZHMgd2l0aAorbXVsdGlwbGUgZGV2aWNlcy4gSWYgcmVjb3JkaW5nIHdpdGggaW50ZXJsZWF2ZWQgbW9kZSBzYW1wbGVzIHRoZSBmaWxlIGlzCithdXRvbWF0aWNhbGx5IHNwbGl0IGJlZm9yZSB0aGUgMkdCIGZpbGVzaXplLgorCitcZkJhcGxheVxmUCBpcyBtdWNoIHRoZSBzYW1lLCBvbmx5IGl0IHBsYXlzIGluc3RlYWQgb2YgcmVjb3JkaW5nLiBGb3IKK3N1cHBvcnRlZCBzb3VuZGZpbGUgZm9ybWF0cywgdGhlIHNhbXBsaW5nIHJhdGUsIGJpdCBkZXB0aCwgYW5kIHNvCitmb3J0aCBjYW4gYmUgYXV0b21hdGljYWxseSBkZXRlcm1pbmVkIGZyb20gdGhlIHNvdW5kZmlsZSBoZWFkZXIuCisKK0lmIGZpbGVuYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBzdGFuZGFyZCBvdXRwdXQgb3IgaW5wdXQgaXMgdXNlZC4gVGhlIFxmQmFwbGF5XGZQIHV0aWxpdHkgYWNjZXB0cyBtdWx0aXBsZSBmaWxlbmFtZXMuCisKKy5TSCBPUFRJT05TCisuVFAKK1xmSVwtaCwgXC1cLWhlbHBcZlAKK0hlbHA6IHNob3cgc3ludGF4LgorLlRQCitcZklcLVwtdmVyc2lvblxmUAorUHJpbnQgY3VycmVudCB2ZXJzaW9uLgorLlRQCitcZklcLWwsIFwtXC1saXN0XC1kZXZpY2VzXGZQCitMaXN0IGFsbCBzb3VuZGNhcmRzIGFuZCBkaWdpdGFsIGF1ZGlvIGRldmljZXMKKy5UUAorXGZJXC1MLCBcLVwtbGlzdFwtcGNtc1xmUAorTGlzdCBhbGwgUENNcyBkZWZpbmVkCisuVFAKK1xmSVwtRCwgXC1cLWRldmljZT1OQU1FXGZQCitTZWxlY3QgUENNIGJ5IG5hbWUKKy5UUAorXGZJXC1xIFwtXC1xdWlldFxmUAorUXVpZXQgbW9kZS4gU3VwcHJlc3MgbWVzc2FnZXMgKG5vdCBzb3VuZCA6KSkKKy5UUAorXGZJXC10LCBcLVwtZmlsZVwtdHlwZSBUWVBFXGZQCitGaWxlIHR5cGUgKHZvYywgd2F2LCByYXcgb3IgYXUpLgorSWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCB0aGUgV0FWRSBmb3JtYXQgaXMgdXNlZC4KKy5UUAorXGZJXC1jLCBcLVwtY2hhbm5lbHM9I1xmUAorVGhlIG51bWJlciBvZiBjaGFubmVscy4KK1RoZSBkZWZhdWx0IGlzIG9uZSBjaGFubmVsLgorVmFsaWQgdmFsdWVzIGFyZSAxIHRocm91Z2ggMzIuCisuVFAKK1xmSVwtZiBcLVwtZm9ybWF0PUZPUk1BVFxmUAorU2FtcGxlIGZvcm1hdAorLmJyCitSZWNvZ25pemVkIHNhbXBsZSBmb3JtYXRzIGFyZTogUzggVTggUzE2X0xFIFMxNl9CRSBVMTZfTEUgVTE2X0JFIFMyNF9MRQorUzI0X0JFIFUyNF9MRSBVMjRfQkUgUzMyX0xFIFMzMl9CRSBVMzJfTEUgVTMyX0JFIEZMT0FUX0xFIEZMT0FUX0JFCitGTE9BVDY0X0xFIEZMT0FUNjRfQkUgSUVDOTU4X1NVQkZSQU1FX0xFIElFQzk1OF9TVUJGUkFNRV9CRSBNVV9MQVcKK0FfTEFXIElNQV9BRFBDTSBNUEVHIEdTTSBTUEVDSUFMIFMyNF8zTEUgUzI0XzNCRSBVMjRfM0xFIFUyNF8zQkUgUzIwXzNMRQorUzIwXzNCRSBVMjBfM0xFIFUyMF8zQkUgUzE4XzNMRSBTMThfM0JFIFUxOF8zTEUKKy5icgorU29tZSBvZiB0aGVzZSBtYXkgbm90IGJlIGF2YWlsYWJsZSBvbiBzZWxlY3RlZCBoYXJkd2FyZQorLmJyCitUaGUgYXZhaWxhYmxlIGZvcm1hdCBzaG9ydGN1dHMgYXJlOgorLm5mCitcLWYgY2QgKDE2IGJpdCBsaXR0bGUgZW5kaWFuLCA0NDEwMCwgc3RlcmVvKSBbXC1mIFMxNl9MRSBcLWMyIFwtcjQ0MTAwXQorXC1mIGNkciAoMTYgYml0IGJpZyBlbmRpYW4sIDQ0MTAwLCBzdGVyZW8pIFtcLWYgUzE2X0JFIFwtYzIgXC1mNDQxMDBdCitcLWYgZGF0ICgxNiBiaXQgbGl0dGxlIGVuZGlhbiwgNDgwMDAsIHN0ZXJlbykgW1wtZiBTMTZfTEUgXC1jMiBcLXI0ODAwMF0KKy5maQorSWYgbm8gZm9ybWF0IGlzIGdpdmVuIFU4IGlzIHVzZWQuCisuVFAKK1xmSVwtciwgXC1cLXJhdGU9IzxIej5cZlAKK1NhbXBsaW5nIHJhdGUgaW4gSGVydHouIFRoZSBkZWZhdWx0IHJhdGUgaXMgODAwMCBIZXJ0ei4KK0lmIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaXMgbGVzcyB0aGFuIDMwMCwgaXQgaXMgdGFrZW4gYXMgdGhlIHJhdGUgaW4ga2lsb2hlcnR6LgorVmFsaWQgdmFsdWVzIGFyZSAyMDAwIHRocm91Z2ggMTkyMDAwIEhlcnR6LgorLlRQCitcZklcLWQsIFwtXC1kdXJhdGlvbj0jXGZQCitJbnRlcnJ1cHQgYWZ0ZXIgIyBzZWNvbmRzLgorQSB2YWx1ZSBvZiB6ZXJvIG1lYW5zIGluZmluaXR5LgorVGhlIGRlZmF1bHQgaXMgemVybywgc28gaWYgdGhpcyBvcHRpb24gaXMgb21pdHRlZCB0aGVuIHRoZSBhcmVjb3JkIHByb2Nlc3Mgd2lsbCBydW4gdW50aWwgaXQgaXMga2lsbGVkLgorLlRQCitcZklcLXMsIFwtXC1zbGVlcFwtbWluPSNcZlAKK01pbiB0aWNrcyB0byBzbGVlcC4gVGhlIGRlZmF1bHQgaXMgbm90IHRvIHNsZWVwLgorLlRQCitcZklcLU0sIFwtXC1tbWFwXGZQICAgICAgICAgICAgCitVc2UgbWVtb3J5LW1hcHBlZCAobW1hcCkgSS9PIG1vZGUgZm9yIHRoZSBhdWRpbyBzdHJlYW0uCitJZiB0aGlzIG9wdGlvbiBpcyBub3Qgc2V0LCB0aGUgcmVhZC93cml0ZSBJL08gbW9kZSB3aWxsIGJlIHVzZWQuCisuVFAKK1xmSVwtTiwgXC1cLW5vbmJsb2NrXGZQICAgICAgICAgIAorT3BlbiB0aGUgYXVkaW8gZGV2aWNlIGluIG5vbi1ibG9ja2luZyBtb2RlLiBJZiB0aGUgZGV2aWNlIGlzIGJ1c3kgdGhlIHByb2dyYW0gd2lsbCBleGl0IGltbWVkaWF0ZWx5LgorSWYgdGhpcyBvcHRpb24gaXMgbm90IHNldCB0aGUgcHJvZ3JhbSB3aWxsIGJsb2NrIHVudGlsIHRoZSBhdWRpbyBkZXZpY2UgaXMgYXZhaWxhYmxlIGFnYWluLgorLlRQCitcZklcLUYsIFwtXC1wZXJpb2RcLXRpbWU9I1xmUCAgICAgCitEaXN0YW5jZSBiZXR3ZWVuIGludGVycnVwdHMgaXMgIyBtaWNyb3NlY29uZHMuCitJZiBubyBwZXJpb2QgdGltZSBhbmQgbm8gcGVyaW9kIHNpemUgaXMgZ2l2ZW4gdGhlbiBhIHF1YXJ0ZXIgb2YgdGhlIGJ1ZmZlciB0aW1lIGlzIHNldC4KKy5UUAorXGZJXC1CLCBcLVwtYnVmZmVyXC10aW1lPSNcZlAgICAgIAorQnVmZmVyIGR1cmF0aW9uIGlzICMgbWljcm9zZWNvbmRzCitJZiBubyBidWZmZXIgdGltZSBhbmQgbm8gYnVmZmVyIHNpemUgaXMgZ2l2ZW4gdGhlbiB0aGUgbWF4aW1hbCBhbGxvd2VkIGJ1ZmZlciB0aW1lIGJ1dCBub3QgbW9yZSB0aGFuIDUwMG1zIGlzIHNldC4KKy5UUAorXGZJXC1cLXBlcmlvZFwtc2l6ZT0jXGZQICAgICAKK0Rpc3RhbmNlIGJldHdlZW4gaW50ZXJydXB0cyBpcyAjIGZyYW1lcworSWYgbm8gcGVyaW9kIHNpemUgYW5kIG5vIHBlcmlvZCB0aW1lIGlzIGdpdmVuIHRoZW4gYSBxdWFydGVyIG9mIHRoZSBidWZmZXIgc2l6ZSBpcyBzZXQuCisuVFAKK1xmSVwtXC1idWZmZXJcLXNpemU9I1xmUCAgICAgCitCdWZmZXIgZHVyYXRpb24gaXMgIyBmcmFtZXMKK0lmIG5vIGJ1ZmZlciB0aW1lIGFuZCBubyBidWZmZXIgc2l6ZSBpcyBnaXZlbiB0aGVuIHRoZSBtYXhpbWFsIGFsbG93ZWQgYnVmZmVyIHRpbWUgYnV0IG5vdCBtb3JlIHRoYW4gNTAwbXMgaXMgc2V0LgorLlRQCitcZklcLUEsIFwtXC1hdmFpbFwtbWluPSNcZlAgICAgICAgCitNaW4gYXZhaWxhYmxlIHNwYWNlIGZvciB3YWtldXAgaXMgIyBtaWNyb3NlY29uZHMKKy5UUAorXGZJXC1SLCBcLVwtc3RhcnRcLWRlbGF5PSNcZlAgICAgIAorRGVsYXkgZm9yIGF1dG9tYXRpYyBQQ00gc3RhcnQgaXMgIyBtaWNyb3NlY29uZHMgCisocmVsYXRpdmUgdG8gYnVmZmVyIHNpemUgaWYgPD0gMCkKKy5UUAorXGZJXC1ULCBcLVwtc3RvcFwtZGVsYXk9I1xmUCAgICAgIAorRGVsYXkgZm9yIGF1dG9tYXRpYyBQQ00gc3RvcCBpcyAjIG1pY3Jvc2Vjb25kcyBmcm9tIHhydW4KKy5UUAorXGZJXC12LCBcLVwtdmVyYm9zZVxmUCAgICAgICAgICAgCitTaG93IFBDTSBzdHJ1Y3R1cmUgYW5kIHNldHVwLgorVGhpcyBvcHRpb24gaXMgYWNjdW11bGF0aXZlLiAgVGhlIFZVIG1ldGVyIGlzIGRpc3BsYXllZCB3aGVuIHRoaXMKK2lzIGdpdmVuIHR3aWNlIG9yIHRocmVlIHRpbWVzLgorLlRQCitcZklcLVYsIFwtXC12dW1ldGVyPVRZUEVcZlAKK1NwZWNpZmllcyB0aGUgVlUtbWV0ZXIgdHlwZSwgZWl0aGVyIFxmSXN0ZXJlb1xmUCBvciBcZkltb25vXGZQLgorVGhlIHN0ZXJlbyBWVS1tZXRlciBpcyBhdmFpbGFibGUgb25seSBmb3IgMi1jaGFubmVsIHN0ZXJlbyBzYW1wbGVzCit3aXRoIGludGVybGVhdmVkIGZvcm1hdC4KKy5UUAorXGZJXC1JLCBcLVwtc2VwYXJhdGVcLWNoYW5uZWxzXGZQIAorT25lIGZpbGUgZm9yIGVhY2ggY2hhbm5lbC4gIFRoaXMgb3B0aW9uIGRpc2FibGVzIG1heFwtZmlsZVwtdGltZQorYW5kIHVzZVwtc3RyZnRpbWUsIGFuZCBpZ25vcmVzIFNJR1VTUjEuICBUaGUgc3RlcmVvIFZVIG1ldGVyIGlzCitub3QgYXZhaWxhYmxlIHdpdGggc2VwYXJhdGUgY2hhbm5lbHMuCisuVFAKK1xmSVwtUFxmUAorUGxheWJhY2suICBUaGlzIGlzIHRoZSBkZWZhdWx0IGlmIHRoZSBwcm9ncmFtIGlzIGludm9rZWQKK2J5IHR5cGluZyBhcGxheS4KKy5UUAorXGZJXC1DXGZQCitSZWNvcmQuICBUaGlzIGlzIHRoZSBkZWZhdWx0IGlmIHRoZSBwcm9ncmFtIGlzIGludm9rZWQKK2J5IHR5cGluZyBhcmVjb3JkLgorLlRQCitcZklcLWksIFwtXC1pbnRlcmFjdGl2ZVxmUAorQWxsb3cgaW50ZXJhY3RpdmUgb3BlcmF0aW9uIHZpYSBzdGRpbi4KK0N1cnJlbnRseSBvbmx5IHBhdXNlL3Jlc3VtZSB2aWEgc3BhY2Ugb3IgZW50ZXIga2V5IGlzIGltcGxlbWVudGVkLgorLlRQCitcZklcLVwtZGlzYWJsZVwtcmVzYW1wbGVcZlAKK0Rpc2FibGUgYXV0b21hdGljIHJhdGUgcmVzYW1wbGUuCisuVFAKK1xmSVwtXC1kaXNhYmxlXC1jaGFubmVsc1xmUAorRGlzYWJsZSBhdXRvbWF0aWMgY2hhbm5lbCBjb252ZXJzaW9ucy4KKy5UUAorXGZJXC1cLWRpc2FibGVcLWZvcm1hdFxmUAorRGlzYWJsZSBhdXRvbWF0aWMgZm9ybWF0IGNvbnZlcnNpb25zLgorLlRQCitcZklcLVwtZGlzYWJsZVwtc29mdHZvbFxmUAorRGlzYWJsZSBzb2Z0d2FyZSB2b2x1bWUgY29udHJvbCAoc29mdHZvbCkuCisuVFAKK1xmSVwtXC10ZXN0XC1wb3NpdGlvblxmUAorVGVzdCByaW5nIGJ1ZmZlciBwb3NpdGlvbi4KKy5UUAorXGZJXC1cLXRlc3RcLWNvZWY9PGNvZWY+XGZQCitUZXN0IGNvZWZmaWNpZW50IGZvciByaW5nIGJ1ZmZlciBwb3NpdGlvbjsgZGVmYXVsdCBpcyA4LgorRXhwcmVzc2lvbiBmb3IgdmFsaWRhdGlvbiBpczogY29lZiAqIChidWZmZXJfc2l6ZSAvIDIpLgorTWluaW11bSB2YWx1ZSBpcyAxLgorLlRQCitcZklcLVwtdGVzdFwtbm93YWl0XGZQCitEbyBub3Qgd2FpdCBmb3IgdGhlIHJpbmcgYnVmZmVyLS1lYXRzIHRoZSB3aG9sZSBDUFUuCisuVFAKK1xmSVwtXC1tYXhcLWZpbGVcLXRpbWVcZlAKK1doaWxlIHJlY29yZGluZywgd2hlbiB0aGUgb3V0cHV0IGZpbGUgaGFzIGJlZW4gYWNjdW11bGF0aW5nCitzb3VuZCBmb3IgdGhpcyBsb25nLAorY2xvc2UgaXQgYW5kIG9wZW4gYSBuZXcgb3V0cHV0IGZpbGUuICBEZWZhdWx0IGlzIHRoZSBtYXhpbXVtCitzaXplIHN1cHBvcnRlZCBieSB0aGUgZmlsZSBmb3JtYXQ6IDIgR2lCIGZvciBXQVYgZmlsZXMuCitUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmICBcLVwtc2VwYXJhdGVcLWNoYW5uZWxzIGlzCitzcGVjaWZpZWQuCisuVFAKK1xmSVwtXC1wcm9jZXNzXC1pZFwtZmlsZSA8ZmlsZSBuYW1lPlxmUAorYXBsYXkgd3JpdGVzIGl0cyBwcm9jZXNzIElEIGhlcmUsIHNvIG90aGVyIHByb2dyYW1zIGNhbgorc2VuZCBzaWduYWxzIHRvIGl0LgorLlRQCitcZklcLVwtdXNlXC1zdHJmdGltZVxmUAorV2hlbiByZWNvcmRpbmcsIGludGVycHJldCAlLWNvZGVzIGluIHRoZSBmaWxlIG5hbWUgcGFyYW1ldGVyIHVzaW5nCit0aGUgc3RyZnRpbWUgZmFjaWxpdHkgd2hlbmV2ZXIgdGhlIG91dHB1dCBmaWxlIGlzIG9wZW5lZC4gIFRoZQoraW1wb3J0YW50IHN0cmZ0aW1lIGNvZGVzIGFyZTogJVkgaXMgdGhlIHllYXIsICVtIG1vbnRoLCAlZCBkYXkgb2YKK3RoZSBtb250aCwgJUggaG91ciwgJU0gbWludXRlIGFuZCAlUyBzZWNvbmQuICBJbiBhZGRpdGlvbiwgJXYgaXMKK3RoZSBmaWxlIG51bWJlciwgc3RhcnRpbmcgYXQgMS4gIFdoZW4gdGhpcyBvcHRpb24gaXMgc3BlY2lmaWVkLAoraW50ZXJtZWRpYXRlIGRpcmVjdG9yaWVzIGZvciB0aGUgb3V0cHV0IGZpbGUgYXJlIGNyZWF0ZWQgYXV0b21hdGljYWxseS4KK1RoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgaWYgXC1cLXNlcGFyYXRlXC1jaGFubmVscyBpcyBzcGVjaWZpZWQuCisKKy5TSCBTSUdOQUxTCitXaGVuIHJlY29yZGluZywgU0lHSU5ULCBTSUdURVJNIGFuZCBTSUdBQlJUIHdpbGwgY2xvc2UgdGhlIG91dHB1dCAKK2ZpbGUgYW5kIGV4aXQuICBTSUdVU1IxIHdpbGwgY2xvc2UgdGhlIG91dHB1dCBmaWxlLCBvcGVuIGEgbmV3IG9uZSwKK2FuZCBjb250aW51ZSByZWNvcmRpbmcuICBIb3dldmVyLCBTSUdVU1IxIGRvZXMgbm90IHdvcmsgd2l0aAorXC1cLXNlcGFyYXRlXC1jaGFubmVscy4KKworLlNIIEVYQU1QTEVTCisKKy5UUAorXGZCYXBsYXkgXC1jIDEgXC10IHJhdyBcLXIgMjIwNTAgXC1mIG11X2xhdyBmb29iYXJcZlIKK3dpbGwgcGxheSB0aGUgcmF3IGZpbGUgImZvb2JhciIgYXMgYQorMjIwNTAtSHosIG1vbm8sIDgtYml0LCBNdS1MYXcgLmF1IGZpbGUuIAorCisuVFAKK1xmQmFyZWNvcmQgXC1kIDEwIFwtZiBjZCBcLXQgd2F2IFwtRCBjb3B5IGZvb2Jhci53YXZcZlAKK3dpbGwgcmVjb3JkIGZvb2Jhci53YXYgYXMgYSAxMC1zZWNvbmQsIENELXF1YWxpdHkgd2F2ZSBmaWxlLCB1c2luZyB0aGUKK1BDTSAiY29weSIgKHdoaWNoIG1pZ2h0IGJlIGRlZmluZWQgaW4gdGhlIHVzZXIncyAuYXNvdW5kcmMgZmlsZSBhczoKKy5uZgorcGNtLmNvcHkgeworICB0eXBlIHBsdWcKKyAgc2xhdmUgeworICAgIHBjbSBodworICB9CisgIHJvdXRlX3BvbGljeSBjb3B5Cit9CisuZmkKKworLlRQCitcZkJhcmVjb3JkIFwtdCB3YXYgXC1tYXgtZmlsZV90aW1lIDMwIG1vbi53YXZcZlAKK1JlY29yZCBmcm9tIHRoZSBkZWZhdWx0IGF1ZGlvIHNvdXJjZSBpbiBtb25hdXJhbCwgOCwwMDAgc2FtcGxlcworcGVyIHNlY29uZCwgOCBiaXRzIHBlciBzYW1wbGUuICBTdGFydCBhIG5ldyBmaWxlIGV2ZXJ5CiszMCBzZWNvbmRzLiAgRmlsZSBuYW1lcyBhcmUgbW9uLW5uLndhdiwgd2hlcmUgbm4gaW5jcmVhc2VzCitmcm9tIDAxLiAgVGhlIGZpbGUgYWZ0ZXIgbW9uLTk5LndhdiBpcyBtb24tMTAwLndhdi4KKworLlRQCitcZkJhcmVjb3JkIFwtZiBjZCBcLXQgd2F2IFwtbWF4LWZpbGUtdGltZSAzNjAwIC0tdXNlLXN0cmZ0aW1lICVZLyVtLyVkL2xpc3Rlbi0lSC0lTS0ldi53YXZcZlAKK1JlY29yZCBpbiBzdGVyZW8gZnJvbSB0aGUgZGVmYXVsdCBhdWRpbyBzb3VyY2UuICBDcmVhdGUgYSBuZXcgZmlsZQorZXZlcnkgaG91ci4gIFRoZSBmaWxlcyBhcmUgcGxhY2VkIGluIGRpcmVjdG9yaWVzIGJhc2VkIG9uIHRoZWlyIHN0YXJ0IGRhdGVzCithbmQgaGF2ZSBuYW1lcyB3aGljaCBpbmNsdWRlIHRoZWlyIHN0YXJ0IHRpbWVzIGFuZCBmaWxlIG51bWJlcnMuCisKKy5TSCBTRUUgQUxTTworXGZCCithbHNhbWl4ZXIoMSksCithbWl4ZXIoMSkKK1xmUAorCisuU0ggQlVHUyAKK05vdGUgdGhhdCAuYWlmZiBmaWxlcyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCisKKy5TSCBBVVRIT1IKK1xmQmFyZWNvcmRcZlAgYW5kIFxmQmFwbGF5XGZQIGFyZSBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorVGhpcyBkb2N1bWVudCBpcyBieSBQYXVsIFdpbmtsZXIgPHphcm16YXJtQGVyb2xzLmNvbT4uCitVcGRhdGVkIGZvciBBbHNhIDAuOSBieSBKYW1lcyBUYXBwaW4gPGphbWVzQHhlbmEudWtsaW51eC5uZXQ+CisKZGlmZiAtLWdpdCBhL2FwbGF5L2FwbGF5LmMgYi9hcGxheS9hcGxheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYTk1NDQKLS0tIC9kZXYvbnVsbAorKysgYi9hcGxheS9hcGxheS5jCkBAIC0wLDAgKzEsMjk5MSBAQAorLyoKKyAqICBhcGxheS5jIC0gcGxheXMgYW5kIHJlY29yZHMKKyAqCisgKiAgICAgIENSRUFUSVZFIExBQlMgQ0hBTk5FTC1maWxlcworICogICAgICBNaWNyb3NvZnQgV0FWRS1maWxlcworICogICAgICBTUEFSQyBBVURJTyAuQVUtZmlsZXMKKyAqICAgICAgUmF3IERhdGEKKyAqCisgKiAgQ29weXJpZ2h0IChjKSBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICogIEJhc2VkIG9uIHZwbGF5IHByb2dyYW0gYnkgTWljaGFlbCBCZWNrCisgKgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2RlZmluZSBfR05VX1NPVVJDRQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGxvY2FsZS5oPgorI2luY2x1ZGUgPGFsc2EvYXNvdW5kbGliLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3NpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZW5kaWFuLmg+CisjaW5jbHVkZSAiYWNvbmZpZy5oIgorI2luY2x1ZGUgImdldHRleHQuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCisjaWZuZGVmIExMT05HX01BWAorI2RlZmluZSBMTE9OR19NQVggICAgOTIyMzM3MjAzNjg1NDc3NTgwN0xMCisjZW5kaWYKKworI2lmbmRlZiBsZTE2dG9oCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2RlZmluZSBsZTE2dG9oKHgpIF9fbGUxNl90b19jcHUoeCkKKyNkZWZpbmUgYmUxNnRvaCh4KSBfX2JlMTZfdG9fY3B1KHgpCisjZGVmaW5lIGxlMzJ0b2goeCkgX19sZTMyX3RvX2NwdSh4KQorI2RlZmluZSBiZTMydG9oKHgpIF9fYmUzMl90b19jcHUoeCkKKyNlbmRpZgorCisjZGVmaW5lIERFRkFVTFRfRk9STUFUCQlTTkRfUENNX0ZPUk1BVF9VOAorI2RlZmluZSBERUZBVUxUX1NQRUVEIAkJODAwMAorCisjZGVmaW5lIEZPUk1BVF9ERUZBVUxUCQktMQorI2RlZmluZSBGT1JNQVRfUkFXCQkwCisjZGVmaW5lIEZPUk1BVF9WT0MJCTEKKyNkZWZpbmUgRk9STUFUX1dBVkUJCTIKKyNkZWZpbmUgRk9STUFUX0FVCQkzCisKKy8qIGdsb2JhbCBkYXRhICovCisKK3N0YXRpYyBzbmRfcGNtX3NmcmFtZXNfdCAoKnJlYWRpX2Z1bmMpKHNuZF9wY21fdCAqaGFuZGxlLCB2b2lkICpidWZmZXIsIHNuZF9wY21fdWZyYW1lc190IHNpemUpOworc3RhdGljIHNuZF9wY21fc2ZyYW1lc190ICgqd3JpdGVpX2Z1bmMpKHNuZF9wY21fdCAqaGFuZGxlLCBjb25zdCB2b2lkICpidWZmZXIsIHNuZF9wY21fdWZyYW1lc190IHNpemUpOworc3RhdGljIHNuZF9wY21fc2ZyYW1lc190ICgqcmVhZG5fZnVuYykoc25kX3BjbV90ICpoYW5kbGUsIHZvaWQgKipidWZzLCBzbmRfcGNtX3VmcmFtZXNfdCBzaXplKTsKK3N0YXRpYyBzbmRfcGNtX3NmcmFtZXNfdCAoKndyaXRlbl9mdW5jKShzbmRfcGNtX3QgKmhhbmRsZSwgdm9pZCAqKmJ1ZnMsIHNuZF9wY21fdWZyYW1lc190IHNpemUpOworCitlbnVtIHsKKwlWVU1FVEVSX05PTkUsCisJVlVNRVRFUl9NT05PLAorCVZVTUVURVJfU1RFUkVPCit9OworCitzdGF0aWMgY2hhciAqY29tbWFuZDsKK3N0YXRpYyBzbmRfcGNtX3QgKmhhbmRsZTsKK3N0YXRpYyBzdHJ1Y3QgeworCXNuZF9wY21fZm9ybWF0X3QgZm9ybWF0OworCXVuc2lnbmVkIGludCBjaGFubmVsczsKKwl1bnNpZ25lZCBpbnQgcmF0ZTsKK30gaHdwYXJhbXMsIHJod3BhcmFtczsKK3N0YXRpYyBpbnQgdGltZWxpbWl0ID0gMDsKK3N0YXRpYyBpbnQgcXVpZXRfbW9kZSA9IDA7CitzdGF0aWMgaW50IGZpbGVfdHlwZSA9IEZPUk1BVF9ERUZBVUxUOworc3RhdGljIGludCBvcGVuX21vZGUgPSAwOworc3RhdGljIHNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtID0gU05EX1BDTV9TVFJFQU1fUExBWUJBQ0s7CitzdGF0aWMgaW50IG1tYXBfZmxhZyA9IDA7CitzdGF0aWMgaW50IGludGVybGVhdmVkID0gMTsKK3N0YXRpYyBpbnQgbm9uYmxvY2sgPSAwOworc3RhdGljIHVfY2hhciAqYXVkaW9idWYgPSBOVUxMOworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IGNodW5rX3NpemUgPSAwOworc3RhdGljIHVuc2lnbmVkIHBlcmlvZF90aW1lID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBidWZmZXJfdGltZSA9IDA7CitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QgcGVyaW9kX2ZyYW1lcyA9IDA7CitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QgYnVmZmVyX2ZyYW1lcyA9IDA7CitzdGF0aWMgaW50IGF2YWlsX21pbiA9IC0xOworc3RhdGljIGludCBzdGFydF9kZWxheSA9IDA7CitzdGF0aWMgaW50IHN0b3BfZGVsYXkgPSAwOworc3RhdGljIGludCBtb25vdG9uaWMgPSAwOworc3RhdGljIGludCBpbnRlcmFjdGl2ZSA9IDA7CitzdGF0aWMgaW50IGNhbl9wYXVzZSA9IDA7CitzdGF0aWMgaW50IHZlcmJvc2UgPSAwOworc3RhdGljIGludCB2dW1ldGVyID0gVlVNRVRFUl9OT05FOworc3RhdGljIGludCBidWZmZXJfcG9zID0gMDsKK3N0YXRpYyBzaXplX3QgYml0c19wZXJfc2FtcGxlLCBiaXRzX3Blcl9mcmFtZTsKK3N0YXRpYyBzaXplX3QgY2h1bmtfYnl0ZXM7CitzdGF0aWMgaW50IHRlc3RfcG9zaXRpb24gPSAwOworc3RhdGljIGludCB0ZXN0X2NvZWYgPSA4Oworc3RhdGljIGludCB0ZXN0X25vd2FpdCA9IDA7CitzdGF0aWMgc25kX291dHB1dF90ICpsb2c7CitzdGF0aWMgbG9uZyBsb25nIG1heF9maWxlX3NpemUgPSAwOworc3RhdGljIGludCBtYXhfZmlsZV90aW1lID0gMDsKK3N0YXRpYyBpbnQgdXNlX3N0cmZ0aW1lID0gMDsKK3ZvbGF0aWxlIHN0YXRpYyBpbnQgcmVjeWNsZV9jYXB0dXJlX2ZpbGUgPSAwOworc3RhdGljIGxvbmcgdGVybV9jX2xmbGFnID0gLTE7CisKK3N0YXRpYyBpbnQgZmQgPSAtMTsKK3N0YXRpYyBvZmY2NF90IHBicmVjX2NvdW50ID0gTExPTkdfTUFYLCBmZGNvdW50Oworc3RhdGljIGludCB2b2NtYWpvciwgdm9jbWlub3I7CisKK3N0YXRpYyBjaGFyICpwaWRmaWxlX25hbWUgPSBOVUxMOworRklMRSAqcGlkZiA9IE5VTEw7CitzdGF0aWMgaW50IHBpZGZpbGVfd3JpdHRlbiA9IDA7CisKKy8qIG5lZWRlZCBwcm90b3R5cGVzICovCisKK3N0YXRpYyB2b2lkIGRvbmVfc3RkaW4odm9pZCk7CisKK3N0YXRpYyB2b2lkIHBsYXliYWNrKGNoYXIgKmZpbGVuYW1lKTsKK3N0YXRpYyB2b2lkIGNhcHR1cmUoY2hhciAqZmlsZW5hbWUpOworc3RhdGljIHZvaWQgcGxheWJhY2t2KGNoYXIgKipmaWxlbmFtZXMsIHVuc2lnbmVkIGludCBjb3VudCk7CitzdGF0aWMgdm9pZCBjYXB0dXJldihjaGFyICoqZmlsZW5hbWVzLCB1bnNpZ25lZCBpbnQgY291bnQpOworCitzdGF0aWMgdm9pZCBiZWdpbl92b2MoaW50IGZkLCBzaXplX3QgY291bnQpOworc3RhdGljIHZvaWQgZW5kX3ZvYyhpbnQgZmQpOworc3RhdGljIHZvaWQgYmVnaW5fd2F2ZShpbnQgZmQsIHNpemVfdCBjb3VudCk7CitzdGF0aWMgdm9pZCBlbmRfd2F2ZShpbnQgZmQpOworc3RhdGljIHZvaWQgYmVnaW5fYXUoaW50IGZkLCBzaXplX3QgY291bnQpOworc3RhdGljIHZvaWQgZW5kX2F1KGludCBmZCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZm10X2NhcHR1cmUgeworCXZvaWQgKCpzdGFydCkgKGludCBmZCwgc2l6ZV90IGNvdW50KTsKKwl2b2lkICgqZW5kKSAoaW50IGZkKTsKKwljaGFyICp3aGF0OworCWxvbmcgbG9uZyBtYXhfZmlsZXNpemU7Cit9IGZtdF9yZWNfdGFibGVbXSA9IHsKKwl7CU5VTEwsCQlOVUxMLAkJTl8oInJhdyBkYXRhIiksCQlMTE9OR19NQVggfSwKKwl7CWJlZ2luX3ZvYywJZW5kX3ZvYywJTl8oIlZPQyIpLAkJMTYwMDAwMDBMTCB9LAorCS8qIEZJWE1FOiBjYW4gV0FWIGhhbmRsZSBleGFjdGx5IDJHQiBvciBsZXNzIHRoYW4gaXQ/ICovCisJewliZWdpbl93YXZlLAllbmRfd2F2ZSwJTl8oIldBVkUiKSwJCTIxNDc0ODM2NDhMTCB9LAorCXsJYmVnaW5fYXUsCWVuZF9hdSwJCU5fKCJTcGFyYyBBdWRpbyIpLAlMTE9OR19NQVggfQorfTsKKworI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NSkKKyNkZWZpbmUgZXJyb3IoLi4uKSBkbyB7XAorCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzOiVkOiAiLCBjb21tYW5kLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgXAorCWZwcmludGYoc3RkZXJyLCBfX1ZBX0FSR1NfXyk7IFwKKwlwdXRjKCdcbicsIHN0ZGVycik7IFwKK30gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBlcnJvcihhcmdzLi4uKSBkbyB7XAorCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzOiVkOiAiLCBjb21tYW5kLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgXAorCWZwcmludGYoc3RkZXJyLCAjI2FyZ3MpOyBcCisJcHV0YygnXG4nLCBzdGRlcnIpOyBcCit9IHdoaWxlICgwKQorI2VuZGlmCQorCitzdGF0aWMgdm9pZCB1c2FnZShjaGFyICpjb21tYW5kKQoreworCXNuZF9wY21fZm9ybWF0X3QgazsKKwlwcmludGYoCitfKCJVc2FnZTogJXMgW09QVElPTl0uLi4gW0ZJTEVdLi4uXG4iCisiXG4iCisiLWgsIC0taGVscCAgICAgICAgICAgICAgaGVscFxuIgorIiAgICAtLXZlcnNpb24gICAgICAgICAgIHByaW50IGN1cnJlbnQgdmVyc2lvblxuIgorIi1sLCAtLWxpc3QtZGV2aWNlcyAgICAgIGxpc3QgYWxsIHNvdW5kY2FyZHMgYW5kIGRpZ2l0YWwgYXVkaW8gZGV2aWNlc1xuIgorIi1MLCAtLWxpc3QtcGNtcyAgICAgICAgIGxpc3QgZGV2aWNlIG5hbWVzXG4iCisiLUQsIC0tZGV2aWNlPU5BTUUgICAgICAgc2VsZWN0IFBDTSBieSBuYW1lXG4iCisiLXEsIC0tcXVpZXQgICAgICAgICAgICAgcXVpZXQgbW9kZVxuIgorIi10LCAtLWZpbGUtdHlwZSBUWVBFICAgIGZpbGUgdHlwZSAodm9jLCB3YXYsIHJhdyBvciBhdSlcbiIKKyItYywgLS1jaGFubmVscz0jICAgICAgICBjaGFubmVsc1xuIgorIi1mLCAtLWZvcm1hdD1GT1JNQVQgICAgIHNhbXBsZSBmb3JtYXQgKGNhc2UgaW5zZW5zaXRpdmUpXG4iCisiLXIsIC0tcmF0ZT0jICAgICAgICAgICAgc2FtcGxlIHJhdGVcbiIKKyItZCwgLS1kdXJhdGlvbj0jICAgICAgICBpbnRlcnJ1cHQgYWZ0ZXIgIyBzZWNvbmRzXG4iCisiLU0sIC0tbW1hcCAgICAgICAgICAgICAgbW1hcCBzdHJlYW1cbiIKKyItTiwgLS1ub25ibG9jayAgICAgICAgICBub25ibG9ja2luZyBtb2RlXG4iCisiLUYsIC0tcGVyaW9kLXRpbWU9IyAgICAgZGlzdGFuY2UgYmV0d2VlbiBpbnRlcnJ1cHRzIGlzICMgbWljcm9zZWNvbmRzXG4iCisiLUIsIC0tYnVmZmVyLXRpbWU9IyAgICAgYnVmZmVyIGR1cmF0aW9uIGlzICMgbWljcm9zZWNvbmRzXG4iCisiICAgIC0tcGVyaW9kLXNpemU9IyAgICAgZGlzdGFuY2UgYmV0d2VlbiBpbnRlcnJ1cHRzIGlzICMgZnJhbWVzXG4iCisiICAgIC0tYnVmZmVyLXNpemU9IyAgICAgYnVmZmVyIGR1cmF0aW9uIGlzICMgZnJhbWVzXG4iCisiLUEsIC0tYXZhaWwtbWluPSMgICAgICAgbWluIGF2YWlsYWJsZSBzcGFjZSBmb3Igd2FrZXVwIGlzICMgbWljcm9zZWNvbmRzXG4iCisiLVIsIC0tc3RhcnQtZGVsYXk9IyAgICAgZGVsYXkgZm9yIGF1dG9tYXRpYyBQQ00gc3RhcnQgaXMgIyBtaWNyb3NlY29uZHMgXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgKHJlbGF0aXZlIHRvIGJ1ZmZlciBzaXplIGlmIDw9IDApXG4iCisiLVQsIC0tc3RvcC1kZWxheT0jICAgICAgZGVsYXkgZm9yIGF1dG9tYXRpYyBQQ00gc3RvcCBpcyAjIG1pY3Jvc2Vjb25kcyBmcm9tIHhydW5cbiIKKyItdiwgLS12ZXJib3NlICAgICAgICAgICBzaG93IFBDTSBzdHJ1Y3R1cmUgYW5kIHNldHVwIChhY2N1bXVsYXRpdmUpXG4iCisiLVYsIC0tdnVtZXRlcj1UWVBFICAgICAgZW5hYmxlIFZVIG1ldGVyIChUWVBFOiBtb25vIG9yIHN0ZXJlbylcbiIKKyItSSwgLS1zZXBhcmF0ZS1jaGFubmVscyBvbmUgZmlsZSBmb3IgZWFjaCBjaGFubmVsXG4iCisiLWksIC0taW50ZXJhY3RpdmUgICAgICAgYWxsb3cgaW50ZXJhY3RpdmUgb3BlcmF0aW9uIGZyb20gc3RkaW5cbiIKKyIgICAgLS1kaXNhYmxlLXJlc2FtcGxlICBkaXNhYmxlIGF1dG9tYXRpYyByYXRlIHJlc2FtcGxlXG4iCisiICAgIC0tZGlzYWJsZS1jaGFubmVscyAgZGlzYWJsZSBhdXRvbWF0aWMgY2hhbm5lbCBjb252ZXJzaW9uc1xuIgorIiAgICAtLWRpc2FibGUtZm9ybWF0ICAgIGRpc2FibGUgYXV0b21hdGljIGZvcm1hdCBjb252ZXJzaW9uc1xuIgorIiAgICAtLWRpc2FibGUtc29mdHZvbCAgIGRpc2FibGUgc29mdHdhcmUgdm9sdW1lIGNvbnRyb2wgKHNvZnR2b2wpXG4iCisiICAgIC0tdGVzdC1wb3NpdGlvbiAgICAgdGVzdCByaW5nIGJ1ZmZlciBwb3NpdGlvblxuIgorIiAgICAtLXRlc3QtY29lZj0jICAgICAgIHRlc3QgY29lZmZpY2llbnQgZm9yIHJpbmcgYnVmZmVyIHBvc2l0aW9uIChkZWZhdWx0IDgpXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiBmb3IgdmFsaWRhdGlvbiBpczogY29lZiAqIChidWZmZXJfc2l6ZSAvIDIpXG4iCisiICAgIC0tdGVzdC1ub3dhaXQgICAgICAgZG8gbm90IHdhaXQgZm9yIHJpbmcgYnVmZmVyIC0gZWF0cyB3aG9sZSBDUFVcbiIKKyIgICAgLS1tYXgtZmlsZS10aW1lPSMgICBzdGFydCBhbm90aGVyIG91dHB1dCBmaWxlIHdoZW4gdGhlIG9sZCBmaWxlIGhhcyByZWNvcmRlZFxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGlzIG1hbnkgc2Vjb25kc1xuIgorIiAgICAtLXByb2Nlc3MtaWQtZmlsZSAgIHdyaXRlIHRoZSBwcm9jZXNzIElEIGhlcmVcbiIKKyIgICAgLS11c2Utc3RyZnRpbWUgICAgICBhcHBseSB0aGUgc3RyZnRpbWUgZmFjaWxpdHkgdG8gdGhlIG91dHB1dCBmaWxlIG5hbWVcbiIpCisJCSwgY29tbWFuZCk7CisJcHJpbnRmKF8oIlJlY29nbml6ZWQgc2FtcGxlIGZvcm1hdHMgYXJlOiIpKTsKKwlmb3IgKGsgPSAwOyBrIDwgU05EX1BDTV9GT1JNQVRfTEFTVDsgKytrKSB7CisJCWNvbnN0IGNoYXIgKnMgPSBzbmRfcGNtX2Zvcm1hdF9uYW1lKGspOworCQlpZiAocykKKwkJCXByaW50ZigiICVzIiwgcyk7CisJfQorCXByaW50ZihfKCJcblNvbWUgb2YgdGhlc2UgbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gc2VsZWN0ZWQgaGFyZHdhcmVcbiIpKTsKKwlwcmludGYoXygiVGhlIGF2YWlsYWJsZWQgZm9ybWF0IHNob3J0Y3V0cyBhcmU6XG4iKSk7CisJcHJpbnRmKF8oIi1mIGNkICgxNiBiaXQgbGl0dGxlIGVuZGlhbiwgNDQxMDAsIHN0ZXJlbylcbiIpKTsKKwlwcmludGYoXygiLWYgY2RyICgxNiBiaXQgYmlnIGVuZGlhbiwgNDQxMDAsIHN0ZXJlbylcbiIpKTsKKwlwcmludGYoXygiLWYgZGF0ICgxNiBiaXQgbGl0dGxlIGVuZGlhbiwgNDgwMDAsIHN0ZXJlbylcbiIpKTsKK30KKworc3RhdGljIHZvaWQgZGV2aWNlX2xpc3Qodm9pZCkKK3sKKwlzbmRfY3RsX3QgKmhhbmRsZTsKKwlpbnQgY2FyZCwgZXJyLCBkZXYsIGlkeDsKKwlzbmRfY3RsX2NhcmRfaW5mb190ICppbmZvOworCXNuZF9wY21faW5mb190ICpwY21pbmZvOworCXNuZF9jdGxfY2FyZF9pbmZvX2FsbG9jYSgmaW5mbyk7CisJc25kX3BjbV9pbmZvX2FsbG9jYSgmcGNtaW5mbyk7CisKKwljYXJkID0gLTE7CisJaWYgKHNuZF9jYXJkX25leHQoJmNhcmQpIDwgMCB8fCBjYXJkIDwgMCkgeworCQllcnJvcihfKCJubyBzb3VuZGNhcmRzIGZvdW5kLi4uIikpOworCQlyZXR1cm47CisJfQorCXByaW50ZihfKCIqKioqIExpc3Qgb2YgJXMgSGFyZHdhcmUgRGV2aWNlcyAqKioqXG4iKSwKKwkgICAgICAgc25kX3BjbV9zdHJlYW1fbmFtZShzdHJlYW0pKTsKKwl3aGlsZSAoY2FyZCA+PSAwKSB7CisJCWNoYXIgbmFtZVszMl07CisJCXNwcmludGYobmFtZSwgImh3OiVkIiwgY2FyZCk7CisJCWlmICgoZXJyID0gc25kX2N0bF9vcGVuKCZoYW5kbGUsIG5hbWUsIDApKSA8IDApIHsKKwkJCWVycm9yKCJjb250cm9sIG9wZW4gKCVpKTogJXMiLCBjYXJkLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJCQlnb3RvIG5leHRfY2FyZDsKKwkJfQorCQlpZiAoKGVyciA9IHNuZF9jdGxfY2FyZF9pbmZvKGhhbmRsZSwgaW5mbykpIDwgMCkgeworCQkJZXJyb3IoImNvbnRyb2wgaGFyZHdhcmUgaW5mbyAoJWkpOiAlcyIsIGNhcmQsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJCXNuZF9jdGxfY2xvc2UoaGFuZGxlKTsKKwkJCWdvdG8gbmV4dF9jYXJkOworCQl9CisJCWRldiA9IC0xOworCQl3aGlsZSAoMSkgeworCQkJdW5zaWduZWQgaW50IGNvdW50OworCQkJaWYgKHNuZF9jdGxfcGNtX25leHRfZGV2aWNlKGhhbmRsZSwgJmRldik8MCkKKwkJCQllcnJvcigic25kX2N0bF9wY21fbmV4dF9kZXZpY2UiKTsKKwkJCWlmIChkZXYgPCAwKQorCQkJCWJyZWFrOworCQkJc25kX3BjbV9pbmZvX3NldF9kZXZpY2UocGNtaW5mbywgZGV2KTsKKwkJCXNuZF9wY21faW5mb19zZXRfc3ViZGV2aWNlKHBjbWluZm8sIDApOworCQkJc25kX3BjbV9pbmZvX3NldF9zdHJlYW0ocGNtaW5mbywgc3RyZWFtKTsKKwkJCWlmICgoZXJyID0gc25kX2N0bF9wY21faW5mbyhoYW5kbGUsIHBjbWluZm8pKSA8IDApIHsKKwkJCQlpZiAoZXJyICE9IC1FTk9FTlQpCisJCQkJCWVycm9yKCJjb250cm9sIGRpZ2l0YWwgYXVkaW8gaW5mbyAoJWkpOiAlcyIsIGNhcmQsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXByaW50ZihfKCJjYXJkICVpOiAlcyBbJXNdLCBkZXZpY2UgJWk6ICVzIFslc11cbiIpLAorCQkJCWNhcmQsIHNuZF9jdGxfY2FyZF9pbmZvX2dldF9pZChpbmZvKSwgc25kX2N0bF9jYXJkX2luZm9fZ2V0X25hbWUoaW5mbyksCisJCQkJZGV2LAorCQkJCXNuZF9wY21faW5mb19nZXRfaWQocGNtaW5mbyksCisJCQkJc25kX3BjbV9pbmZvX2dldF9uYW1lKHBjbWluZm8pKTsKKwkJCWNvdW50ID0gc25kX3BjbV9pbmZvX2dldF9zdWJkZXZpY2VzX2NvdW50KHBjbWluZm8pOworCQkJcHJpbnRmKCBfKCIgIFN1YmRldmljZXM6ICVpLyVpXG4iKSwKKwkJCQlzbmRfcGNtX2luZm9fZ2V0X3N1YmRldmljZXNfYXZhaWwocGNtaW5mbyksIGNvdW50KTsKKwkJCWZvciAoaWR4ID0gMDsgaWR4IDwgKGludCljb3VudDsgaWR4KyspIHsKKwkJCQlzbmRfcGNtX2luZm9fc2V0X3N1YmRldmljZShwY21pbmZvLCBpZHgpOworCQkJCWlmICgoZXJyID0gc25kX2N0bF9wY21faW5mbyhoYW5kbGUsIHBjbWluZm8pKSA8IDApIHsKKwkJCQkJZXJyb3IoImNvbnRyb2wgZGlnaXRhbCBhdWRpbyBwbGF5YmFjayBpbmZvICglaSk6ICVzIiwgY2FyZCwgc25kX3N0cmVycm9yKGVycikpOworCQkJCX0gZWxzZSB7CisJCQkJCXByaW50ZihfKCIgIFN1YmRldmljZSAjJWk6ICVzXG4iKSwKKwkJCQkJCWlkeCwgc25kX3BjbV9pbmZvX2dldF9zdWJkZXZpY2VfbmFtZShwY21pbmZvKSk7CisJCQkJfQorCQkJfQorCQl9CisJCXNuZF9jdGxfY2xvc2UoaGFuZGxlKTsKKwluZXh0X2NhcmQ6CisJCWlmIChzbmRfY2FyZF9uZXh0KCZjYXJkKSA8IDApIHsKKwkJCWVycm9yKCJzbmRfY2FyZF9uZXh0Iik7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcGNtX2xpc3Qodm9pZCkKK3sKKwl2b2lkICoqaGludHMsICoqbjsKKwljaGFyICpuYW1lLCAqZGVzY3IsICpkZXNjcjEsICppbzsKKwljb25zdCBjaGFyICpmaWx0ZXI7CisKKwlpZiAoc25kX2RldmljZV9uYW1lX2hpbnQoLTEsICJwY20iLCAmaGludHMpIDwgMCkKKwkJcmV0dXJuOworCW4gPSBoaW50czsKKwlmaWx0ZXIgPSBzdHJlYW0gPT0gU05EX1BDTV9TVFJFQU1fQ0FQVFVSRSA/ICJJbnB1dCIgOiAiT3V0cHV0IjsKKwl3aGlsZSAoKm4gIT0gTlVMTCkgeworCQluYW1lID0gc25kX2RldmljZV9uYW1lX2dldF9oaW50KCpuLCAiTkFNRSIpOworCQlkZXNjciA9IHNuZF9kZXZpY2VfbmFtZV9nZXRfaGludCgqbiwgIkRFU0MiKTsKKwkJaW8gPSBzbmRfZGV2aWNlX25hbWVfZ2V0X2hpbnQoKm4sICJJT0lEIik7CisJCWlmIChpbyAhPSBOVUxMICYmIHN0cmNtcChpbywgZmlsdGVyKSAhPSAwKQorCQkJZ290byBfX2VuZDsKKwkJcHJpbnRmKCIlc1xuIiwgbmFtZSk7CisJCWlmICgoZGVzY3IxID0gZGVzY3IpICE9IE5VTEwpIHsKKwkJCXByaW50ZigiICAgICIpOworCQkJd2hpbGUgKCpkZXNjcjEpIHsKKwkJCQlpZiAoKmRlc2NyMSA9PSAnXG4nKQorCQkJCQlwcmludGYoIlxuICAgICIpOworCQkJCWVsc2UKKwkJCQkJcHV0Y2hhcigqZGVzY3IxKTsKKwkJCQlkZXNjcjErKzsKKwkJCX0KKwkJCXB1dGNoYXIoJ1xuJyk7CisJCX0KKwkgICAgICBfX2VuZDoKKwkgICAgICAJaWYgKG5hbWUgIT0gTlVMTCkKKwkgICAgICAJCWZyZWUobmFtZSk7CisJCWlmIChkZXNjciAhPSBOVUxMKQorCQkJZnJlZShkZXNjcik7CisJCWlmIChpbyAhPSBOVUxMKQorCQkJZnJlZShpbyk7CisJCW4rKzsKKwl9CisJc25kX2RldmljZV9uYW1lX2ZyZWVfaGludChoaW50cyk7Cit9CisKK3N0YXRpYyB2b2lkIHZlcnNpb24odm9pZCkKK3sKKwlwcmludGYoIiVzOiB2ZXJzaW9uICIgU05EX1VUSUxfVkVSU0lPTl9TVFIgIiBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PlxuIiwgY29tbWFuZCk7Cit9CisKKy8qCisgKglTdWJyb3V0aW5lIHRvIGNsZWFuIHVwIGJlZm9yZSBleGl0LgorICovCitzdGF0aWMgdm9pZCBwcmdfZXhpdChpbnQgY29kZSkgCit7CisJZG9uZV9zdGRpbigpOworCWlmIChoYW5kbGUpCisJCXNuZF9wY21fY2xvc2UoaGFuZGxlKTsKKwlpZiAocGlkZmlsZV93cml0dGVuKQorCQlyZW1vdmUgKHBpZGZpbGVfbmFtZSk7CisJZXhpdChjb2RlKTsKK30KKworc3RhdGljIHZvaWQgc2lnbmFsX2hhbmRsZXIoaW50IHNpZykKK3sKKwlzdGF0aWMgaW50IGluX2Fib3J0aW5nOworCisJaWYgKGluX2Fib3J0aW5nKQorCQlyZXR1cm47CisKKwlpbl9hYm9ydGluZyA9IDE7CisJaWYgKHZlcmJvc2U9PTIpCisJCXB1dGNoYXIoJ1xuJyk7CisJaWYgKCFxdWlldF9tb2RlKQorCQlmcHJpbnRmKHN0ZGVyciwgXygiQWJvcnRlZCBieSBzaWduYWwgJXMuLi5cbiIpLCBzdHJzaWduYWwoc2lnKSk7CisJaWYgKHN0cmVhbSA9PSBTTkRfUENNX1NUUkVBTV9DQVBUVVJFKSB7CisJCWlmIChmbXRfcmVjX3RhYmxlW2ZpbGVfdHlwZV0uZW5kKSB7CisJCQlmbXRfcmVjX3RhYmxlW2ZpbGVfdHlwZV0uZW5kKGZkKTsKKwkJCWZkID0gLTE7CisJCX0KKwkJc3RyZWFtID0gLTE7CisJfQorCWlmIChmZCA+IDEpIHsKKwkJY2xvc2UoZmQpOworCQlmZCA9IC0xOworCX0KKwlpZiAoaGFuZGxlICYmIHNpZyAhPSBTSUdBQlJUKSB7CisJCXNuZF9wY21fY2xvc2UoaGFuZGxlKTsKKwkJaGFuZGxlID0gTlVMTDsKKwl9CisJcHJnX2V4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworLyogY2FsbCBvbiBTSUdVU1IxIHNpZ25hbC4gKi8KK3N0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyX3JlY3ljbGUgKGludCBzaWcpCit7CisJLyogZmxhZyB0aGUgY2FwdHVyZSBsb29wIHRvIHN0YXJ0IGEgbmV3IG91dHB1dCBmaWxlICovCisJcmVjeWNsZV9jYXB0dXJlX2ZpbGUgPSAxOworfQorCitlbnVtIHsKKwlPUFRfVkVSU0lPTiA9IDEsCisJT1BUX1BFUklPRF9TSVpFLAorCU9QVF9CVUZGRVJfU0laRSwKKwlPUFRfRElTQUJMRV9SRVNBTVBMRSwKKwlPUFRfRElTQUJMRV9DSEFOTkVMUywKKwlPUFRfRElTQUJMRV9GT1JNQVQsCisJT1BUX0RJU0FCTEVfU09GVFZPTCwKKwlPUFRfVEVTVF9QT1NJVElPTiwKKwlPUFRfVEVTVF9DT0VGLAorCU9QVF9URVNUX05PV0FJVCwKKwlPUFRfTUFYX0ZJTEVfVElNRSwKKwlPUFRfUFJPQ0VTU19JRF9GSUxFLAorCU9QVF9VU0VfU1RSRlRJTUUKK307CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IG9wdGlvbl9pbmRleDsKKwlzdGF0aWMgY29uc3QgY2hhciBzaG9ydF9vcHRpb25zW10gPSAiaG5sTEQ6cXQ6YzpmOnI6ZDpNTkY6QTpSOlQ6Qjp2VjpJUENpIjsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKKwkJeyJoZWxwIiwgMCwgMCwgJ2gnfSwKKwkJeyJ2ZXJzaW9uIiwgMCwgMCwgT1BUX1ZFUlNJT059LAorCQl7Imxpc3QtZGV2bmFtZXMiLCAwLCAwLCAnbid9LAorCQl7Imxpc3QtZGV2aWNlcyIsIDAsIDAsICdsJ30sCisJCXsibGlzdC1wY21zIiwgMCwgMCwgJ0wnfSwKKwkJeyJkZXZpY2UiLCAxLCAwLCAnRCd9LAorCQl7InF1aWV0IiwgMCwgMCwgJ3EnfSwKKwkJeyJmaWxlLXR5cGUiLCAxLCAwLCAndCd9LAorCQl7ImNoYW5uZWxzIiwgMSwgMCwgJ2MnfSwKKwkJeyJmb3JtYXQiLCAxLCAwLCAnZid9LAorCQl7InJhdGUiLCAxLCAwLCAncid9LAorCQl7ImR1cmF0aW9uIiwgMSwgMCAsJ2QnfSwKKwkJeyJtbWFwIiwgMCwgMCwgJ00nfSwKKwkJeyJub25ibG9jayIsIDAsIDAsICdOJ30sCisJCXsicGVyaW9kLXRpbWUiLCAxLCAwLCAnRid9LAorCQl7InBlcmlvZC1zaXplIiwgMSwgMCwgT1BUX1BFUklPRF9TSVpFfSwKKwkJeyJhdmFpbC1taW4iLCAxLCAwLCAnQSd9LAorCQl7InN0YXJ0LWRlbGF5IiwgMSwgMCwgJ1InfSwKKwkJeyJzdG9wLWRlbGF5IiwgMSwgMCwgJ1QnfSwKKwkJeyJidWZmZXItdGltZSIsIDEsIDAsICdCJ30sCisJCXsiYnVmZmVyLXNpemUiLCAxLCAwLCBPUFRfQlVGRkVSX1NJWkV9LAorCQl7InZlcmJvc2UiLCAwLCAwLCAndid9LAorCQl7InZ1bWV0ZXIiLCAxLCAwLCAnVid9LAorCQl7InNlcGFyYXRlLWNoYW5uZWxzIiwgMCwgMCwgJ0knfSwKKwkJeyJwbGF5YmFjayIsIDAsIDAsICdQJ30sCisJCXsiY2FwdHVyZSIsIDAsIDAsICdDJ30sCisJCXsiZGlzYWJsZS1yZXNhbXBsZSIsIDAsIDAsIE9QVF9ESVNBQkxFX1JFU0FNUExFfSwKKwkJeyJkaXNhYmxlLWNoYW5uZWxzIiwgMCwgMCwgT1BUX0RJU0FCTEVfQ0hBTk5FTFN9LAorCQl7ImRpc2FibGUtZm9ybWF0IiwgMCwgMCwgT1BUX0RJU0FCTEVfRk9STUFUfSwKKwkJeyJkaXNhYmxlLXNvZnR2b2wiLCAwLCAwLCBPUFRfRElTQUJMRV9TT0ZUVk9MfSwKKwkJeyJ0ZXN0LXBvc2l0aW9uIiwgMCwgMCwgT1BUX1RFU1RfUE9TSVRJT059LAorCQl7InRlc3QtY29lZiIsIDEsIDAsIE9QVF9URVNUX0NPRUZ9LAorCQl7InRlc3Qtbm93YWl0IiwgMCwgMCwgT1BUX1RFU1RfTk9XQUlUfSwKKwkJeyJtYXgtZmlsZS10aW1lIiwgMSwgMCwgT1BUX01BWF9GSUxFX1RJTUV9LAorCQl7InByb2Nlc3MtaWQtZmlsZSIsIDEsIDAsIE9QVF9QUk9DRVNTX0lEX0ZJTEV9LAorCQl7InVzZS1zdHJmdGltZSIsIDAsIDAsIE9QVF9VU0VfU1RSRlRJTUV9LAorCQl7ImludGVyYWN0aXZlIiwgMCwgMCwgJ2knfSwKKwkJezAsIDAsIDAsIDB9CisJfTsKKwljaGFyICpwY21fbmFtZSA9ICJkZWZhdWx0IjsKKwlpbnQgdG1wLCBlcnIsIGM7CisJaW50IGRvX2RldmljZV9saXN0ID0gMCwgZG9fcGNtX2xpc3QgPSAwOworCXNuZF9wY21faW5mb190ICppbmZvOworCisjaWZkZWYgRU5BQkxFX05MUworCXNldGxvY2FsZShMQ19BTEwsICIiKTsKKwl0ZXh0ZG9tYWluKFBBQ0tBR0UpOworI2VuZGlmCisKKwlzbmRfcGNtX2luZm9fYWxsb2NhKCZpbmZvKTsKKworCWVyciA9IHNuZF9vdXRwdXRfc3RkaW9fYXR0YWNoKCZsb2csIHN0ZGVyciwgMCk7CisJYXNzZXJ0KGVyciA+PSAwKTsKKworCWNvbW1hbmQgPSBhcmd2WzBdOworCWZpbGVfdHlwZSA9IEZPUk1BVF9ERUZBVUxUOworCWlmIChzdHJzdHIoYXJndlswXSwgImFyZWNvcmQiKSkgeworCQlzdHJlYW0gPSBTTkRfUENNX1NUUkVBTV9DQVBUVVJFOworCQlmaWxlX3R5cGUgPSBGT1JNQVRfV0FWRTsKKwkJY29tbWFuZCA9ICJhcmVjb3JkIjsKKwkJc3RhcnRfZGVsYXkgPSAxOworCX0gZWxzZSBpZiAoc3Ryc3RyKGFyZ3ZbMF0sICJhcGxheSIpKSB7CisJCXN0cmVhbSA9IFNORF9QQ01fU1RSRUFNX1BMQVlCQUNLOworCQljb21tYW5kID0gImFwbGF5IjsKKwl9IGVsc2UgeworCQllcnJvcihfKCJjb21tYW5kIHNob3VsZCBiZSBuYW1lZCBlaXRoZXIgYXJlY29yZCBvciBhcGxheSIpKTsKKwkJcmV0dXJuIDE7CisJfQorCisJY2h1bmtfc2l6ZSA9IC0xOworCXJod3BhcmFtcy5mb3JtYXQgPSBERUZBVUxUX0ZPUk1BVDsKKwlyaHdwYXJhbXMucmF0ZSA9IERFRkFVTFRfU1BFRUQ7CisJcmh3cGFyYW1zLmNoYW5uZWxzID0gMTsKKworCXdoaWxlICgoYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsIHNob3J0X29wdGlvbnMsIGxvbmdfb3B0aW9ucywgJm9wdGlvbl9pbmRleCkpICE9IC0xKSB7CisJCXN3aXRjaCAoYykgeworCQljYXNlICdoJzoKKwkJCXVzYWdlKGNvbW1hbmQpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgT1BUX1ZFUlNJT046CisJCQl2ZXJzaW9uKCk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSAnbCc6CisJCQlkb19kZXZpY2VfbGlzdCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnTCc6CisJCQlkb19wY21fbGlzdCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnRCc6CisJCQlwY21fbmFtZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdxJzoKKwkJCXF1aWV0X21vZGUgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3QnOgorCQkJaWYgKHN0cmNhc2VjbXAob3B0YXJnLCAicmF3IikgPT0gMCkKKwkJCQlmaWxlX3R5cGUgPSBGT1JNQVRfUkFXOworCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChvcHRhcmcsICJ2b2MiKSA9PSAwKQorCQkJCWZpbGVfdHlwZSA9IEZPUk1BVF9WT0M7CisJCQllbHNlIGlmIChzdHJjYXNlY21wKG9wdGFyZywgIndhdiIpID09IDApCisJCQkJZmlsZV90eXBlID0gRk9STUFUX1dBVkU7CisJCQllbHNlIGlmIChzdHJjYXNlY21wKG9wdGFyZywgImF1IikgPT0gMCB8fCBzdHJjYXNlY21wKG9wdGFyZywgInNwYXJjIikgPT0gMCkKKwkJCQlmaWxlX3R5cGUgPSBGT1JNQVRfQVU7CisJCQllbHNlIHsKKwkJCQllcnJvcihfKCJ1bnJlY29nbml6ZWQgZmlsZSBmb3JtYXQgJXMiKSwgb3B0YXJnKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdjJzoKKwkJCXJod3BhcmFtcy5jaGFubmVscyA9IHN0cnRvbChvcHRhcmcsIE5VTEwsIDApOworCQkJaWYgKHJod3BhcmFtcy5jaGFubmVscyA8IDEgfHwgcmh3cGFyYW1zLmNoYW5uZWxzID4gMjU2KSB7CisJCQkJZXJyb3IoXygidmFsdWUgJWkgZm9yIGNoYW5uZWxzIGlzIGludmFsaWQiKSwgcmh3cGFyYW1zLmNoYW5uZWxzKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCWlmIChzdHJjYXNlY21wKG9wdGFyZywgImNkIikgPT0gMCB8fCBzdHJjYXNlY21wKG9wdGFyZywgImNkciIpID09IDApIHsKKwkJCQlpZiAoc3RyY2FzZWNtcChvcHRhcmcsICJjZHIiKSA9PSAwKQorCQkJCQlyaHdwYXJhbXMuZm9ybWF0ID0gU05EX1BDTV9GT1JNQVRfUzE2X0JFOworCQkJCWVsc2UKKwkJCQkJcmh3cGFyYW1zLmZvcm1hdCA9IGZpbGVfdHlwZSA9PSBGT1JNQVRfQVUgPyBTTkRfUENNX0ZPUk1BVF9TMTZfQkUgOiBTTkRfUENNX0ZPUk1BVF9TMTZfTEU7CisJCQkJcmh3cGFyYW1zLnJhdGUgPSA0NDEwMDsKKwkJCQlyaHdwYXJhbXMuY2hhbm5lbHMgPSAyOworCQkJfSBlbHNlIGlmIChzdHJjYXNlY21wKG9wdGFyZywgImRhdCIpID09IDApIHsKKwkJCQlyaHdwYXJhbXMuZm9ybWF0ID0gZmlsZV90eXBlID09IEZPUk1BVF9BVSA/IFNORF9QQ01fRk9STUFUX1MxNl9CRSA6IFNORF9QQ01fRk9STUFUX1MxNl9MRTsKKwkJCQlyaHdwYXJhbXMucmF0ZSA9IDQ4MDAwOworCQkJCXJod3BhcmFtcy5jaGFubmVscyA9IDI7CisJCQl9IGVsc2UgeworCQkJCXJod3BhcmFtcy5mb3JtYXQgPSBzbmRfcGNtX2Zvcm1hdF92YWx1ZShvcHRhcmcpOworCQkJCWlmIChyaHdwYXJhbXMuZm9ybWF0ID09IFNORF9QQ01fRk9STUFUX1VOS05PV04pIHsKKwkJCQkJZXJyb3IoXygid3JvbmcgZXh0ZW5kZWQgZm9ybWF0ICclcyciKSwgb3B0YXJnKTsKKwkJCQkJcHJnX2V4aXQoRVhJVF9GQUlMVVJFKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQl0bXAgPSBzdHJ0b2wob3B0YXJnLCBOVUxMLCAwKTsKKwkJCWlmICh0bXAgPCAzMDApCisJCQkJdG1wICo9IDEwMDA7CisJCQlyaHdwYXJhbXMucmF0ZSA9IHRtcDsKKwkJCWlmICh0bXAgPCAyMDAwIHx8IHRtcCA+IDE5MjAwMCkgeworCQkJCWVycm9yKF8oImJhZCBzcGVlZCB2YWx1ZSAlaSIpLCB0bXApOworCQkJCXJldHVybiAxOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJdGltZWxpbWl0ID0gc3RydG9sKG9wdGFyZywgTlVMTCwgMCk7CisJCQlicmVhazsKKwkJY2FzZSAnTic6CisJCQlub25ibG9jayA9IDE7CisJCQlvcGVuX21vZGUgfD0gU05EX1BDTV9OT05CTE9DSzsKKwkJCWJyZWFrOworCQljYXNlICdGJzoKKwkJCXBlcmlvZF90aW1lID0gc3RydG9sKG9wdGFyZywgTlVMTCwgMCk7CisJCQlicmVhazsKKwkJY2FzZSAnQic6CisJCQlidWZmZXJfdGltZSA9IHN0cnRvbChvcHRhcmcsIE5VTEwsIDApOworCQkJYnJlYWs7CisJCWNhc2UgT1BUX1BFUklPRF9TSVpFOgorCQkJcGVyaW9kX2ZyYW1lcyA9IHN0cnRvbChvcHRhcmcsIE5VTEwsIDApOworCQkJYnJlYWs7CisJCWNhc2UgT1BUX0JVRkZFUl9TSVpFOgorCQkJYnVmZmVyX2ZyYW1lcyA9IHN0cnRvbChvcHRhcmcsIE5VTEwsIDApOworCQkJYnJlYWs7CisJCWNhc2UgJ0EnOgorCQkJYXZhaWxfbWluID0gc3RydG9sKG9wdGFyZywgTlVMTCwgMCk7CisJCQlicmVhazsKKwkJY2FzZSAnUic6CisJCQlzdGFydF9kZWxheSA9IHN0cnRvbChvcHRhcmcsIE5VTEwsIDApOworCQkJYnJlYWs7CisJCWNhc2UgJ1QnOgorCQkJc3RvcF9kZWxheSA9IHN0cnRvbChvcHRhcmcsIE5VTEwsIDApOworCQkJYnJlYWs7CisJCWNhc2UgJ3YnOgorCQkJdmVyYm9zZSsrOworCQkJaWYgKHZlcmJvc2UgPiAxICYmICF2dW1ldGVyKQorCQkJCXZ1bWV0ZXIgPSBWVU1FVEVSX01PTk87CisJCQlicmVhazsKKwkJY2FzZSAnVic6CisJCQlpZiAoKm9wdGFyZyA9PSAncycpCisJCQkJdnVtZXRlciA9IFZVTUVURVJfU1RFUkVPOworCQkJZWxzZSBpZiAoKm9wdGFyZyA9PSAnbScpCisJCQkJdnVtZXRlciA9IFZVTUVURVJfTU9OTzsKKwkJCWVsc2UKKwkJCQl2dW1ldGVyID0gVlVNRVRFUl9OT05FOworCQkJYnJlYWs7CisJCWNhc2UgJ00nOgorCQkJbW1hcF9mbGFnID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdJJzoKKwkJCWludGVybGVhdmVkID0gMDsKKwkJCWJyZWFrOworCQljYXNlICdQJzoKKwkJCXN0cmVhbSA9IFNORF9QQ01fU1RSRUFNX1BMQVlCQUNLOworCQkJY29tbWFuZCA9ICJhcGxheSI7CisJCQlicmVhazsKKwkJY2FzZSAnQyc6CisJCQlzdHJlYW0gPSBTTkRfUENNX1NUUkVBTV9DQVBUVVJFOworCQkJY29tbWFuZCA9ICJhcmVjb3JkIjsKKwkJCXN0YXJ0X2RlbGF5ID0gMTsKKwkJCWlmIChmaWxlX3R5cGUgPT0gRk9STUFUX0RFRkFVTFQpCisJCQkJZmlsZV90eXBlID0gRk9STUFUX1dBVkU7CisJCQlicmVhazsKKwkJY2FzZSAnaSc6CisJCQlpbnRlcmFjdGl2ZSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfRElTQUJMRV9SRVNBTVBMRToKKwkJCW9wZW5fbW9kZSB8PSBTTkRfUENNX05PX0FVVE9fUkVTQU1QTEU7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfRElTQUJMRV9DSEFOTkVMUzoKKwkJCW9wZW5fbW9kZSB8PSBTTkRfUENNX05PX0FVVE9fQ0hBTk5FTFM7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfRElTQUJMRV9GT1JNQVQ6CisJCQlvcGVuX21vZGUgfD0gU05EX1BDTV9OT19BVVRPX0ZPUk1BVDsKKwkJCWJyZWFrOworCQljYXNlIE9QVF9ESVNBQkxFX1NPRlRWT0w6CisJCQlvcGVuX21vZGUgfD0gU05EX1BDTV9OT19TT0ZUVk9MOworCQkJYnJlYWs7CisJCWNhc2UgT1BUX1RFU1RfUE9TSVRJT046CisJCQl0ZXN0X3Bvc2l0aW9uID0gMTsKKwkJCWJyZWFrOworCQljYXNlIE9QVF9URVNUX0NPRUY6CisJCQl0ZXN0X2NvZWYgPSBzdHJ0b2wob3B0YXJnLCBOVUxMLCAwKTsKKwkJCWlmICh0ZXN0X2NvZWYgPCAxKQorCQkJCXRlc3RfY29lZiA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfVEVTVF9OT1dBSVQ6CisJCQl0ZXN0X25vd2FpdCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfTUFYX0ZJTEVfVElNRToKKwkJCW1heF9maWxlX3RpbWUgPSBzdHJ0b2wob3B0YXJnLCBOVUxMLCAwKTsKKwkJCWJyZWFrOworCQljYXNlIE9QVF9QUk9DRVNTX0lEX0ZJTEU6CisJCQlwaWRmaWxlX25hbWUgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfVVNFX1NUUkZUSU1FOgorCQkJdXNlX3N0cmZ0aW1lID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZnByaW50ZihzdGRlcnIsIF8oIlRyeSBgJXMgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiIpLCBjb21tYW5kKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJaWYgKGRvX2RldmljZV9saXN0KSB7CisJCWlmIChkb19wY21fbGlzdCkgcGNtX2xpc3QoKTsKKwkJZGV2aWNlX2xpc3QoKTsKKwkJZ290byBfX2VuZDsKKwl9IGVsc2UgaWYgKGRvX3BjbV9saXN0KSB7CisJCXBjbV9saXN0KCk7CisJCWdvdG8gX19lbmQ7CisJfQorCisJZXJyID0gc25kX3BjbV9vcGVuKCZoYW5kbGUsIHBjbV9uYW1lLCBzdHJlYW0sIG9wZW5fbW9kZSk7CisJaWYgKGVyciA8IDApIHsKKwkJZXJyb3IoXygiYXVkaW8gb3BlbiBlcnJvcjogJXMiKSwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoKGVyciA9IHNuZF9wY21faW5mbyhoYW5kbGUsIGluZm8pKSA8IDApIHsKKwkJZXJyb3IoXygiaW5mbyBlcnJvcjogJXMiKSwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAobm9uYmxvY2spIHsKKwkJZXJyID0gc25kX3BjbV9ub25ibG9jayhoYW5kbGUsIDEpOworCQlpZiAoZXJyIDwgMCkgeworCQkJZXJyb3IoXygibm9uYmxvY2sgc2V0dGluZyBlcnJvcjogJXMiKSwgc25kX3N0cmVycm9yKGVycikpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwljaHVua19zaXplID0gMTAyNDsKKwlod3BhcmFtcyA9IHJod3BhcmFtczsKKworCWF1ZGlvYnVmID0gKHVfY2hhciAqKW1hbGxvYygxMDI0KTsKKwlpZiAoYXVkaW9idWYgPT0gTlVMTCkgeworCQllcnJvcihfKCJub3QgZW5vdWdoIG1lbW9yeSIpKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKG1tYXBfZmxhZykgeworCQl3cml0ZWlfZnVuYyA9IHNuZF9wY21fbW1hcF93cml0ZWk7CisJCXJlYWRpX2Z1bmMgPSBzbmRfcGNtX21tYXBfcmVhZGk7CisJCXdyaXRlbl9mdW5jID0gc25kX3BjbV9tbWFwX3dyaXRlbjsKKwkJcmVhZG5fZnVuYyA9IHNuZF9wY21fbW1hcF9yZWFkbjsKKwl9IGVsc2UgeworCQl3cml0ZWlfZnVuYyA9IHNuZF9wY21fd3JpdGVpOworCQlyZWFkaV9mdW5jID0gc25kX3BjbV9yZWFkaTsKKwkJd3JpdGVuX2Z1bmMgPSBzbmRfcGNtX3dyaXRlbjsKKwkJcmVhZG5fZnVuYyA9IHNuZF9wY21fcmVhZG47CisJfQorCisJaWYgKHBpZGZpbGVfbmFtZSkgeworCQllcnJubyA9IDA7CisJCXBpZGYgPSBmb3BlbiAocGlkZmlsZV9uYW1lLCAidyIpOworCQlpZiAocGlkZikgeworCQkJKHZvaWQpZnByaW50ZiAocGlkZiwgIiVkXG4iLCBnZXRwaWQoKSk7CisJCQlmY2xvc2UocGlkZik7CisJCQlwaWRmaWxlX3dyaXR0ZW4gPSAxOworCQl9IGVsc2UgeworCQkJZXJyb3IoXygiQ2Fubm90IGNyZWF0ZSBwcm9jZXNzIElEIGZpbGUgJXM6ICVzIiksIAorCQkJCXBpZGZpbGVfbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCXNpZ25hbChTSUdJTlQsIHNpZ25hbF9oYW5kbGVyKTsKKwlzaWduYWwoU0lHVEVSTSwgc2lnbmFsX2hhbmRsZXIpOworCXNpZ25hbChTSUdBQlJULCBzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR1VTUjEsIHNpZ25hbF9oYW5kbGVyX3JlY3ljbGUpOworCWlmIChpbnRlcmxlYXZlZCkgeworCQlpZiAob3B0aW5kID4gYXJnYyAtIDEpIHsKKwkJCWlmIChzdHJlYW0gPT0gU05EX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCQkJcGxheWJhY2soTlVMTCk7CisJCQllbHNlCisJCQkJY2FwdHVyZShOVUxMKTsKKwkJfSBlbHNlIHsKKwkJCXdoaWxlIChvcHRpbmQgPD0gYXJnYyAtIDEpIHsKKwkJCQlpZiAoc3RyZWFtID09IFNORF9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQkJCQlwbGF5YmFjayhhcmd2W29wdGluZCsrXSk7CisJCQkJZWxzZQorCQkJCQljYXB0dXJlKGFyZ3Zbb3B0aW5kKytdKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmIChzdHJlYW0gPT0gU05EX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCQlwbGF5YmFja3YoJmFyZ3Zbb3B0aW5kXSwgYXJnYyAtIG9wdGluZCk7CisJCWVsc2UKKwkJCWNhcHR1cmV2KCZhcmd2W29wdGluZF0sIGFyZ2MgLSBvcHRpbmQpOworCX0KKwlpZiAodmVyYm9zZT09MikKKwkJcHV0Y2hhcignXG4nKTsKKwlzbmRfcGNtX2Nsb3NlKGhhbmRsZSk7CisJaGFuZGxlID0gTlVMTDsKKwlmcmVlKGF1ZGlvYnVmKTsKKyAgICAgIF9fZW5kOgorCXNuZF9vdXRwdXRfY2xvc2UobG9nKTsKKwlzbmRfY29uZmlnX3VwZGF0ZV9mcmVlX2dsb2JhbCgpOworCXByZ19leGl0KEVYSVRfU1VDQ0VTUyk7CisJLyogYXZvaWQgd2FybmluZyAqLworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBTYWZlIHJlYWQgKGZvciBwaXBlcykKKyAqLworIAorc3RhdGljIHNzaXplX3Qgc2FmZV9yZWFkKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3NpemVfdCByZXN1bHQgPSAwLCByZXM7CisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCWlmICgocmVzID0gcmVhZChmZCwgYnVmLCBjb3VudCkpID09IDApCisJCQlicmVhazsKKwkJaWYgKHJlcyA8IDApCisJCQlyZXR1cm4gcmVzdWx0ID4gMCA/IHJlc3VsdCA6IHJlczsKKwkJY291bnQgLT0gcmVzOworCQlyZXN1bHQgKz0gcmVzOworCQlidWYgPSAoY2hhciAqKWJ1ZiArIHJlczsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIFRlc3QsIGlmIGl0IGlzIGEgLlZPQyBmaWxlIGFuZCByZXR1cm4gPj0wIGlmIG9rICh0aGlzIGlzIHRoZSBsZW5ndGggb2YgcmVzdCkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCAwIGlmIG5vdCAKKyAqLworc3RhdGljIGludCB0ZXN0X3ZvY2ZpbGUodm9pZCAqYnVmZmVyKQoreworCVZvY0hlYWRlciAqdnAgPSBidWZmZXI7CisKKwlpZiAoIW1lbWNtcCh2cC0+bWFnaWMsIFZPQ19NQUdJQ19TVFJJTkcsIDIwKSkgeworCQl2b2NtaW5vciA9IExFX1NIT1JUKHZwLT52ZXJzaW9uKSAmIDB4RkY7CisJCXZvY21ham9yID0gTEVfU0hPUlQodnAtPnZlcnNpb24pIC8gMjU2OworCQlpZiAoTEVfU0hPUlQodnAtPnZlcnNpb24pICE9ICgweDEyMzMgLSBMRV9TSE9SVCh2cC0+Y29kZWRfdmVyKSkpCisJCQlyZXR1cm4gLTI7CS8qIGNvZGVkIHZlcnNpb24gbWlzbWF0Y2ggKi8KKwkJcmV0dXJuIExFX1NIT1JUKHZwLT5oZWFkZXJsZW4pIC0gc2l6ZW9mKFZvY0hlYWRlcik7CS8qIDAgbW9zdGx5ICovCisJfQorCXJldHVybiAtMTsJCS8qIG1hZ2ljIHN0cmluZyBmYWlsICovCit9CisKKy8qCisgKiBoZWxwZXIgZm9yIHRlc3Rfd2F2ZWZpbGUKKyAqLworCitzdGF0aWMgc2l6ZV90IHRlc3Rfd2F2ZWZpbGVfcmVhZChpbnQgZmQsIHVfY2hhciAqYnVmZmVyLCBzaXplX3QgKnNpemUsIHNpemVfdCByZXFzaXplLCBpbnQgbGluZSkKK3sKKwlpZiAoKnNpemUgPj0gcmVxc2l6ZSkKKwkJcmV0dXJuICpzaXplOworCWlmICgoc2l6ZV90KXNhZmVfcmVhZChmZCwgYnVmZmVyICsgKnNpemUsIHJlcXNpemUgLSAqc2l6ZSkgIT0gcmVxc2l6ZSAtICpzaXplKSB7CisJCWVycm9yKF8oInJlYWQgZXJyb3IgKGNhbGxlZCBmcm9tIGxpbmUgJWkpIiksIGxpbmUpOworCQlwcmdfZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKwlyZXR1cm4gKnNpemUgPSByZXFzaXplOworfQorCisjZGVmaW5lIGNoZWNrX3dhdmVmaWxlX3NwYWNlKGJ1ZmZlciwgbGVuLCBibGltaXQpIFwKKwlpZiAobGVuID4gYmxpbWl0KSB7IFwKKwkJYmxpbWl0ID0gbGVuOyBcCisJCWlmICgoYnVmZmVyID0gcmVhbGxvYyhidWZmZXIsIGJsaW1pdCkpID09IE5VTEwpIHsgXAorCQkJZXJyb3IoXygibm90IGVub3VnaCBtZW1vcnkiKSk7CQkgIFwKKwkJCXByZ19leGl0KEVYSVRfRkFJTFVSRSk7ICBcCisJCX0gXAorCX0KKworLyoKKyAqIHRlc3QsIGlmIGl0J3MgYSAuV0FWIGZpbGUsID4gMCBpZiBvayAoYW5kIHNldCB0aGUgc3BlZWQsIHN0ZXJlbyBldGMuKQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gMCBpZiBub3QKKyAqIFZhbHVlIHJldHVybmVkIGlzIGJ5dGVzIHRvIGJlIGRpc2NhcmRlZC4KKyAqLworc3RhdGljIHNzaXplX3QgdGVzdF93YXZlZmlsZShpbnQgZmQsIHVfY2hhciAqX2J1ZmZlciwgc2l6ZV90IHNpemUpCit7CisJV2F2ZUhlYWRlciAqaCA9IChXYXZlSGVhZGVyICopX2J1ZmZlcjsKKwl1X2NoYXIgKmJ1ZmZlciA9IE5VTEw7CisJc2l6ZV90IGJsaW1pdCA9IDA7CisJV2F2ZUZtdEJvZHkgKmY7CisJV2F2ZUNodW5rSGVhZGVyICpjOworCXVfaW50IHR5cGUsIGxlbjsKKworCWlmIChzaXplIDwgc2l6ZW9mKFdhdmVIZWFkZXIpKQorCQlyZXR1cm4gLTE7CisJaWYgKGgtPm1hZ2ljICE9IFdBVl9SSUZGIHx8IGgtPnR5cGUgIT0gV0FWX1dBVkUpCisJCXJldHVybiAtMTsKKwlpZiAoc2l6ZSA+IHNpemVvZihXYXZlSGVhZGVyKSkgeworCQljaGVja193YXZlZmlsZV9zcGFjZShidWZmZXIsIHNpemUgLSBzaXplb2YoV2F2ZUhlYWRlciksIGJsaW1pdCk7CisJCW1lbWNweShidWZmZXIsIF9idWZmZXIgKyBzaXplb2YoV2F2ZUhlYWRlciksIHNpemUgLSBzaXplb2YoV2F2ZUhlYWRlcikpOworCX0KKwlzaXplIC09IHNpemVvZihXYXZlSGVhZGVyKTsKKwl3aGlsZSAoMSkgeworCQljaGVja193YXZlZmlsZV9zcGFjZShidWZmZXIsIHNpemVvZihXYXZlQ2h1bmtIZWFkZXIpLCBibGltaXQpOworCQl0ZXN0X3dhdmVmaWxlX3JlYWQoZmQsIGJ1ZmZlciwgJnNpemUsIHNpemVvZihXYXZlQ2h1bmtIZWFkZXIpLCBfX0xJTkVfXyk7CisJCWMgPSAoV2F2ZUNodW5rSGVhZGVyKilidWZmZXI7CisJCXR5cGUgPSBjLT50eXBlOworCQlsZW4gPSBMRV9JTlQoYy0+bGVuZ3RoKTsKKwkJbGVuICs9IGxlbiAlIDI7CisJCWlmIChzaXplID4gc2l6ZW9mKFdhdmVDaHVua0hlYWRlcikpCisJCQltZW1tb3ZlKGJ1ZmZlciwgYnVmZmVyICsgc2l6ZW9mKFdhdmVDaHVua0hlYWRlciksIHNpemUgLSBzaXplb2YoV2F2ZUNodW5rSGVhZGVyKSk7CisJCXNpemUgLT0gc2l6ZW9mKFdhdmVDaHVua0hlYWRlcik7CisJCWlmICh0eXBlID09IFdBVl9GTVQpCisJCQlicmVhazsKKwkJY2hlY2tfd2F2ZWZpbGVfc3BhY2UoYnVmZmVyLCBsZW4sIGJsaW1pdCk7CisJCXRlc3Rfd2F2ZWZpbGVfcmVhZChmZCwgYnVmZmVyLCAmc2l6ZSwgbGVuLCBfX0xJTkVfXyk7CisJCWlmIChzaXplID4gbGVuKQorCQkJbWVtbW92ZShidWZmZXIsIGJ1ZmZlciArIGxlbiwgc2l6ZSAtIGxlbik7CisJCXNpemUgLT0gbGVuOworCX0KKworCWlmIChsZW4gPCBzaXplb2YoV2F2ZUZtdEJvZHkpKSB7CisJCWVycm9yKF8oInVua25vd24gbGVuZ3RoIG9mICdmbXQgJyBjaHVuayAocmVhZCAldSwgc2hvdWxkIGJlICV1IGF0IGxlYXN0KSIpLAorCQkgICAgICBsZW4sICh1X2ludClzaXplb2YoV2F2ZUZtdEJvZHkpKTsKKwkJcHJnX2V4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisJY2hlY2tfd2F2ZWZpbGVfc3BhY2UoYnVmZmVyLCBsZW4sIGJsaW1pdCk7CisJdGVzdF93YXZlZmlsZV9yZWFkKGZkLCBidWZmZXIsICZzaXplLCBsZW4sIF9fTElORV9fKTsKKwlmID0gKFdhdmVGbXRCb2R5KikgYnVmZmVyOworCWlmIChMRV9TSE9SVChmLT5mb3JtYXQpID09IFdBVl9GTVRfRVhURU5TSUJMRSkgeworCQlXYXZlRm10RXh0ZW5zaWJsZUJvZHkgKmZlID0gKFdhdmVGbXRFeHRlbnNpYmxlQm9keSopYnVmZmVyOworCQlpZiAobGVuIDwgc2l6ZW9mKFdhdmVGbXRFeHRlbnNpYmxlQm9keSkpIHsKKwkJCWVycm9yKF8oInVua25vd24gbGVuZ3RoIG9mIGV4dGVuc2libGUgJ2ZtdCAnIGNodW5rIChyZWFkICV1LCBzaG91bGQgYmUgJXUgYXQgbGVhc3QpIiksCisJCQkJCWxlbiwgKHVfaW50KXNpemVvZihXYXZlRm10RXh0ZW5zaWJsZUJvZHkpKTsKKwkJCXByZ19leGl0KEVYSVRfRkFJTFVSRSk7CisJCX0KKwkJaWYgKG1lbWNtcChmZS0+Z3VpZF90YWcsIFdBVl9HVUlEX1RBRywgMTQpICE9IDApIHsKKwkJCWVycm9yKF8oIndyb25nIGZvcm1hdCB0YWcgaW4gZXh0ZW5zaWJsZSAnZm10ICcgY2h1bmsiKSk7CisJCQlwcmdfZXhpdChFWElUX0ZBSUxVUkUpOworCQl9CisJCWYtPmZvcm1hdCA9IGZlLT5ndWlkX2Zvcm1hdDsKKwl9CisgICAgICAgIGlmIChMRV9TSE9SVChmLT5mb3JtYXQpICE9IFdBVl9GTVRfUENNICYmCisgICAgICAgICAgICBMRV9TSE9SVChmLT5mb3JtYXQpICE9IFdBVl9GTVRfSUVFRV9GTE9BVCkgeworICAgICAgICAgICAgICAgIGVycm9yKF8oImNhbid0IHBsYXkgV0FWRS1maWxlIGZvcm1hdCAweCUwNHggd2hpY2ggaXMgbm90IFBDTSBvciBGTE9BVCBlbmNvZGVkIiksIExFX1NIT1JUKGYtPmZvcm1hdCkpOworCQlwcmdfZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKwlpZiAoTEVfU0hPUlQoZi0+Y2hhbm5lbHMpIDwgMSkgeworCQllcnJvcihfKCJjYW4ndCBwbGF5IFdBVkUtZmlsZXMgd2l0aCAlZCB0cmFja3MiKSwgTEVfU0hPUlQoZi0+Y2hhbm5lbHMpKTsKKwkJcHJnX2V4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisJaHdwYXJhbXMuY2hhbm5lbHMgPSBMRV9TSE9SVChmLT5jaGFubmVscyk7CisJc3dpdGNoIChMRV9TSE9SVChmLT5iaXRfcF9zcGwpKSB7CisJY2FzZSA4OgorCQlpZiAoaHdwYXJhbXMuZm9ybWF0ICE9IERFRkFVTFRfRk9STUFUICYmCisJCSAgICBod3BhcmFtcy5mb3JtYXQgIT0gU05EX1BDTV9GT1JNQVRfVTgpCisJCQlmcHJpbnRmKHN0ZGVyciwgXygiV2FybmluZzogZm9ybWF0IGlzIGNoYW5nZWQgdG8gVThcbiIpKTsKKwkJaHdwYXJhbXMuZm9ybWF0ID0gU05EX1BDTV9GT1JNQVRfVTg7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCWlmIChod3BhcmFtcy5mb3JtYXQgIT0gREVGQVVMVF9GT1JNQVQgJiYKKwkJICAgIGh3cGFyYW1zLmZvcm1hdCAhPSBTTkRfUENNX0ZPUk1BVF9TMTZfTEUpCisJCQlmcHJpbnRmKHN0ZGVyciwgXygiV2FybmluZzogZm9ybWF0IGlzIGNoYW5nZWQgdG8gUzE2X0xFXG4iKSk7CisJCWh3cGFyYW1zLmZvcm1hdCA9IFNORF9QQ01fRk9STUFUX1MxNl9MRTsKKwkJYnJlYWs7CisJY2FzZSAyNDoKKwkJc3dpdGNoIChMRV9TSE9SVChmLT5ieXRlX3Bfc3BsKSAvIGh3cGFyYW1zLmNoYW5uZWxzKSB7CisJCWNhc2UgMzoKKwkJCWlmIChod3BhcmFtcy5mb3JtYXQgIT0gREVGQVVMVF9GT1JNQVQgJiYKKwkJCSAgICBod3BhcmFtcy5mb3JtYXQgIT0gU05EX1BDTV9GT1JNQVRfUzI0XzNMRSkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgXygiV2FybmluZzogZm9ybWF0IGlzIGNoYW5nZWQgdG8gUzI0XzNMRVxuIikpOworCQkJaHdwYXJhbXMuZm9ybWF0ID0gU05EX1BDTV9GT1JNQVRfUzI0XzNMRTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlpZiAoaHdwYXJhbXMuZm9ybWF0ICE9IERFRkFVTFRfRk9STUFUICYmCisJCQkgICAgaHdwYXJhbXMuZm9ybWF0ICE9IFNORF9QQ01fRk9STUFUX1MyNF9MRSkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgXygiV2FybmluZzogZm9ybWF0IGlzIGNoYW5nZWQgdG8gUzI0X0xFXG4iKSk7CisJCQlod3BhcmFtcy5mb3JtYXQgPSBTTkRfUENNX0ZPUk1BVF9TMjRfTEU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVycm9yKF8oIiBjYW4ndCBwbGF5IFdBVkUtZmlsZXMgd2l0aCBzYW1wbGUgJWQgYml0cyBpbiAlZCBieXRlcyB3aWRlICglZCBjaGFubmVscykiKSwKKwkJCSAgICAgIExFX1NIT1JUKGYtPmJpdF9wX3NwbCksIExFX1NIT1JUKGYtPmJ5dGVfcF9zcGwpLCBod3BhcmFtcy5jaGFubmVscyk7CisJCQlwcmdfZXhpdChFWElUX0ZBSUxVUkUpOworCQl9CisJCWJyZWFrOworCWNhc2UgMzI6CisgICAgICAgICAgICAgICAgaWYgKExFX1NIT1JUKGYtPmZvcm1hdCkgPT0gV0FWX0ZNVF9QQ00pCisgICAgICAgICAgICAgICAgICAgICAgICBod3BhcmFtcy5mb3JtYXQgPSBTTkRfUENNX0ZPUk1BVF9TMzJfTEU7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoTEVfU0hPUlQoZi0+Zm9ybWF0KSA9PSBXQVZfRk1UX0lFRUVfRkxPQVQpCisgICAgICAgICAgICAgICAgICAgICAgICBod3BhcmFtcy5mb3JtYXQgPSBTTkRfUENNX0ZPUk1BVF9GTE9BVF9MRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyb3IoXygiIGNhbid0IHBsYXkgV0FWRS1maWxlcyB3aXRoIHNhbXBsZSAlZCBiaXRzIHdpZGUiKSwKKwkJICAgICAgTEVfU0hPUlQoZi0+Yml0X3Bfc3BsKSk7CisJCXByZ19leGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCWh3cGFyYW1zLnJhdGUgPSBMRV9JTlQoZi0+c2FtcGxlX2ZxKTsKKwkKKwlpZiAoc2l6ZSA+IGxlbikKKwkJbWVtbW92ZShidWZmZXIsIGJ1ZmZlciArIGxlbiwgc2l6ZSAtIGxlbik7CisJc2l6ZSAtPSBsZW47CisJCisJd2hpbGUgKDEpIHsKKwkJdV9pbnQgdHlwZSwgbGVuOworCisJCWNoZWNrX3dhdmVmaWxlX3NwYWNlKGJ1ZmZlciwgc2l6ZW9mKFdhdmVDaHVua0hlYWRlciksIGJsaW1pdCk7CisJCXRlc3Rfd2F2ZWZpbGVfcmVhZChmZCwgYnVmZmVyLCAmc2l6ZSwgc2l6ZW9mKFdhdmVDaHVua0hlYWRlciksIF9fTElORV9fKTsKKwkJYyA9IChXYXZlQ2h1bmtIZWFkZXIqKWJ1ZmZlcjsKKwkJdHlwZSA9IGMtPnR5cGU7CisJCWxlbiA9IExFX0lOVChjLT5sZW5ndGgpOworCQlpZiAoc2l6ZSA+IHNpemVvZihXYXZlQ2h1bmtIZWFkZXIpKQorCQkJbWVtbW92ZShidWZmZXIsIGJ1ZmZlciArIHNpemVvZihXYXZlQ2h1bmtIZWFkZXIpLCBzaXplIC0gc2l6ZW9mKFdhdmVDaHVua0hlYWRlcikpOworCQlzaXplIC09IHNpemVvZihXYXZlQ2h1bmtIZWFkZXIpOworCQlpZiAodHlwZSA9PSBXQVZfREFUQSkgeworCQkJaWYgKGxlbiA8IHBicmVjX2NvdW50ICYmIGxlbiA8IDB4N2ZmZmZmZmUpCisJCQkJcGJyZWNfY291bnQgPSBsZW47CisJCQlpZiAoc2l6ZSA+IDApCisJCQkJbWVtY3B5KF9idWZmZXIsIGJ1ZmZlciwgc2l6ZSk7CisJCQlmcmVlKGJ1ZmZlcik7CisJCQlyZXR1cm4gc2l6ZTsKKwkJfQorCQlsZW4gKz0gbGVuICUgMjsKKwkJY2hlY2tfd2F2ZWZpbGVfc3BhY2UoYnVmZmVyLCBsZW4sIGJsaW1pdCk7CisJCXRlc3Rfd2F2ZWZpbGVfcmVhZChmZCwgYnVmZmVyLCAmc2l6ZSwgbGVuLCBfX0xJTkVfXyk7CisJCWlmIChzaXplID4gbGVuKQorCQkJbWVtbW92ZShidWZmZXIsIGJ1ZmZlciArIGxlbiwgc2l6ZSAtIGxlbik7CisJCXNpemUgLT0gbGVuOworCX0KKworCS8qIHNob3VsZG4ndCBiZSByZWFjaGVkICovCisJcmV0dXJuIC0xOworfQorCisvKgorCisgKi8KKworc3RhdGljIGludCB0ZXN0X2F1KGludCBmZCwgdm9pZCAqYnVmZmVyKQoreworCUF1SGVhZGVyICphcCA9IGJ1ZmZlcjsKKworCWlmIChhcC0+bWFnaWMgIT0gQVVfTUFHSUMpCisJCXJldHVybiAtMTsKKwlpZiAoQkVfSU5UKGFwLT5oZHJfc2l6ZSkgPiAxMjggfHwgQkVfSU5UKGFwLT5oZHJfc2l6ZSkgPCAyNCkKKwkJcmV0dXJuIC0xOworCXBicmVjX2NvdW50ID0gQkVfSU5UKGFwLT5kYXRhX3NpemUpOworCXN3aXRjaCAoQkVfSU5UKGFwLT5lbmNvZGluZykpIHsKKwljYXNlIEFVX0ZNVF9VTEFXOgorCQlpZiAoaHdwYXJhbXMuZm9ybWF0ICE9IERFRkFVTFRfRk9STUFUICYmCisJCSAgICBod3BhcmFtcy5mb3JtYXQgIT0gU05EX1BDTV9GT1JNQVRfTVVfTEFXKQorCQkJZnByaW50ZihzdGRlcnIsIF8oIldhcm5pbmc6IGZvcm1hdCBpcyBjaGFuZ2VkIHRvIE1VX0xBV1xuIikpOworCQlod3BhcmFtcy5mb3JtYXQgPSBTTkRfUENNX0ZPUk1BVF9NVV9MQVc7CisJCWJyZWFrOworCWNhc2UgQVVfRk1UX0xJTjg6CisJCWlmIChod3BhcmFtcy5mb3JtYXQgIT0gREVGQVVMVF9GT1JNQVQgJiYKKwkJICAgIGh3cGFyYW1zLmZvcm1hdCAhPSBTTkRfUENNX0ZPUk1BVF9VOCkKKwkJCWZwcmludGYoc3RkZXJyLCBfKCJXYXJuaW5nOiBmb3JtYXQgaXMgY2hhbmdlZCB0byBVOFxuIikpOworCQlod3BhcmFtcy5mb3JtYXQgPSBTTkRfUENNX0ZPUk1BVF9VODsKKwkJYnJlYWs7CisJY2FzZSBBVV9GTVRfTElOMTY6CisJCWlmIChod3BhcmFtcy5mb3JtYXQgIT0gREVGQVVMVF9GT1JNQVQgJiYKKwkJICAgIGh3cGFyYW1zLmZvcm1hdCAhPSBTTkRfUENNX0ZPUk1BVF9TMTZfQkUpCisJCQlmcHJpbnRmKHN0ZGVyciwgXygiV2FybmluZzogZm9ybWF0IGlzIGNoYW5nZWQgdG8gUzE2X0JFXG4iKSk7CisJCWh3cGFyYW1zLmZvcm1hdCA9IFNORF9QQ01fRk9STUFUX1MxNl9CRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KKwlod3BhcmFtcy5yYXRlID0gQkVfSU5UKGFwLT5zYW1wbGVfcmF0ZSk7CisJaWYgKGh3cGFyYW1zLnJhdGUgPCAyMDAwIHx8IGh3cGFyYW1zLnJhdGUgPiAyNTYwMDApCisJCXJldHVybiAtMTsKKwlod3BhcmFtcy5jaGFubmVscyA9IEJFX0lOVChhcC0+Y2hhbm5lbHMpOworCWlmIChod3BhcmFtcy5jaGFubmVscyA8IDEgfHwgaHdwYXJhbXMuY2hhbm5lbHMgPiAyNTYpCisJCXJldHVybiAtMTsKKwlpZiAoKHNpemVfdClzYWZlX3JlYWQoZmQsIGJ1ZmZlciArIHNpemVvZihBdUhlYWRlciksIEJFX0lOVChhcC0+aGRyX3NpemUpIC0gc2l6ZW9mKEF1SGVhZGVyKSkgIT0gQkVfSU5UKGFwLT5oZHJfc2l6ZSkgLSBzaXplb2YoQXVIZWFkZXIpKSB7CisJCWVycm9yKF8oInJlYWQgZXJyb3IiKSk7CisJCXByZ19leGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzaG93X2F2YWlsYWJsZV9zYW1wbGVfZm9ybWF0cyhzbmRfcGNtX2h3X3BhcmFtc190KiBwYXJhbXMpCit7CisJc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQ7CisKKwlmcHJpbnRmKHN0ZGVyciwgIkF2YWlsYWJsZSBmb3JtYXRzOlxuIik7CisJZm9yIChmb3JtYXQgPSAwOyBmb3JtYXQgPCBTTkRfUENNX0ZPUk1BVF9MQVNUOyBmb3JtYXQrKykgeworCQlpZiAoc25kX3BjbV9od19wYXJhbXNfdGVzdF9mb3JtYXQoaGFuZGxlLCBwYXJhbXMsIGZvcm1hdCkgPT0gMCkKKwkJCWZwcmludGYoc3RkZXJyLCAiLSAlc1xuIiwgc25kX3BjbV9mb3JtYXRfbmFtZShmb3JtYXQpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNldF9wYXJhbXModm9pZCkKK3sKKwlzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXM7CisJc25kX3BjbV9zd19wYXJhbXNfdCAqc3dwYXJhbXM7CisJc25kX3BjbV91ZnJhbWVzX3QgYnVmZmVyX3NpemU7CisJaW50IGVycjsKKwlzaXplX3QgbjsKKwl1bnNpZ25lZCBpbnQgcmF0ZTsKKwlzbmRfcGNtX3VmcmFtZXNfdCBzdGFydF90aHJlc2hvbGQsIHN0b3BfdGhyZXNob2xkOworCXNuZF9wY21faHdfcGFyYW1zX2FsbG9jYSgmcGFyYW1zKTsKKwlzbmRfcGNtX3N3X3BhcmFtc19hbGxvY2EoJnN3cGFyYW1zKTsKKwllcnIgPSBzbmRfcGNtX2h3X3BhcmFtc19hbnkoaGFuZGxlLCBwYXJhbXMpOworCWlmIChlcnIgPCAwKSB7CisJCWVycm9yKF8oIkJyb2tlbiBjb25maWd1cmF0aW9uIGZvciB0aGlzIFBDTTogbm8gY29uZmlndXJhdGlvbnMgYXZhaWxhYmxlIikpOworCQlwcmdfZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKwlpZiAobW1hcF9mbGFnKSB7CisJCXNuZF9wY21fYWNjZXNzX21hc2tfdCAqbWFzayA9IGFsbG9jYShzbmRfcGNtX2FjY2Vzc19tYXNrX3NpemVvZigpKTsKKwkJc25kX3BjbV9hY2Nlc3NfbWFza19ub25lKG1hc2spOworCQlzbmRfcGNtX2FjY2Vzc19tYXNrX3NldChtYXNrLCBTTkRfUENNX0FDQ0VTU19NTUFQX0lOVEVSTEVBVkVEKTsKKwkJc25kX3BjbV9hY2Nlc3NfbWFza19zZXQobWFzaywgU05EX1BDTV9BQ0NFU1NfTU1BUF9OT05JTlRFUkxFQVZFRCk7CisJCXNuZF9wY21fYWNjZXNzX21hc2tfc2V0KG1hc2ssIFNORF9QQ01fQUNDRVNTX01NQVBfQ09NUExFWCk7CisJCWVyciA9IHNuZF9wY21faHdfcGFyYW1zX3NldF9hY2Nlc3NfbWFzayhoYW5kbGUsIHBhcmFtcywgbWFzayk7CisJfSBlbHNlIGlmIChpbnRlcmxlYXZlZCkKKwkJZXJyID0gc25kX3BjbV9od19wYXJhbXNfc2V0X2FjY2VzcyhoYW5kbGUsIHBhcmFtcywKKwkJCQkJCSAgIFNORF9QQ01fQUNDRVNTX1JXX0lOVEVSTEVBVkVEKTsKKwllbHNlCisJCWVyciA9IHNuZF9wY21faHdfcGFyYW1zX3NldF9hY2Nlc3MoaGFuZGxlLCBwYXJhbXMsCisJCQkJCQkgICBTTkRfUENNX0FDQ0VTU19SV19OT05JTlRFUkxFQVZFRCk7CisJaWYgKGVyciA8IDApIHsKKwkJZXJyb3IoXygiQWNjZXNzIHR5cGUgbm90IGF2YWlsYWJsZSIpKTsKKwkJcHJnX2V4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisJZXJyID0gc25kX3BjbV9od19wYXJhbXNfc2V0X2Zvcm1hdChoYW5kbGUsIHBhcmFtcywgaHdwYXJhbXMuZm9ybWF0KTsKKwlpZiAoZXJyIDwgMCkgeworCQllcnJvcihfKCJTYW1wbGUgZm9ybWF0IG5vbiBhdmFpbGFibGUiKSk7CisJCXNob3dfYXZhaWxhYmxlX3NhbXBsZV9mb3JtYXRzKHBhcmFtcyk7CisJCXByZ19leGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCWVyciA9IHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVscyhoYW5kbGUsIHBhcmFtcywgaHdwYXJhbXMuY2hhbm5lbHMpOworCWlmIChlcnIgPCAwKSB7CisJCWVycm9yKF8oIkNoYW5uZWxzIGNvdW50IG5vbiBhdmFpbGFibGUiKSk7CisJCXByZ19leGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCisjaWYgMAorCWVyciA9IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX21pbihoYW5kbGUsIHBhcmFtcywgMik7CisJYXNzZXJ0KGVyciA+PSAwKTsKKyNlbmRpZgorCXJhdGUgPSBod3BhcmFtcy5yYXRlOworCWVyciA9IHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX25lYXIoaGFuZGxlLCBwYXJhbXMsICZod3BhcmFtcy5yYXRlLCAwKTsKKwlhc3NlcnQoZXJyID49IDApOworCWlmICgoZmxvYXQpcmF0ZSAqIDEuMDUgPCBod3BhcmFtcy5yYXRlIHx8IChmbG9hdClyYXRlICogMC45NSA+IGh3cGFyYW1zLnJhdGUpIHsKKwkJaWYgKCFxdWlldF9tb2RlKSB7CisJCQljaGFyIHBsdWdleFs2NF07CisJCQljb25zdCBjaGFyICpwY21uYW1lID0gc25kX3BjbV9uYW1lKGhhbmRsZSk7CisJCQlmcHJpbnRmKHN0ZGVyciwgXygiV2FybmluZzogcmF0ZSBpcyBub3QgYWNjdXJhdGUgKHJlcXVlc3RlZCA9ICVpSHosIGdvdCA9ICVpSHopXG4iKSwgcmF0ZSwgaHdwYXJhbXMucmF0ZSk7CisJCQlpZiAoISBwY21uYW1lIHx8IHN0cmNocihzbmRfcGNtX25hbWUoaGFuZGxlKSwgJzonKSkKKwkJCQkqcGx1Z2V4ID0gMDsKKwkJCWVsc2UKKwkJCQlzbnByaW50ZihwbHVnZXgsIHNpemVvZihwbHVnZXgpLCAiKC1EcGx1ZzolcykiLAorCQkJCQkgc25kX3BjbV9uYW1lKGhhbmRsZSkpOworCQkJZnByaW50ZihzdGRlcnIsIF8oIiAgICAgICAgIHBsZWFzZSwgdHJ5IHRoZSBwbHVnIHBsdWdpbiAlc1xuIiksCisJCQkJcGx1Z2V4KTsKKwkJfQorCX0KKwlyYXRlID0gaHdwYXJhbXMucmF0ZTsKKwlpZiAoYnVmZmVyX3RpbWUgPT0gMCAmJiBidWZmZXJfZnJhbWVzID09IDApIHsKKwkJZXJyID0gc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl90aW1lX21heChwYXJhbXMsCisJCQkJCQkJICAgICZidWZmZXJfdGltZSwgMCk7CisJCWFzc2VydChlcnIgPj0gMCk7CisJCWlmIChidWZmZXJfdGltZSA+IDUwMDAwMCkKKwkJCWJ1ZmZlcl90aW1lID0gNTAwMDAwOworCX0KKwlpZiAocGVyaW9kX3RpbWUgPT0gMCAmJiBwZXJpb2RfZnJhbWVzID09IDApIHsKKwkJaWYgKGJ1ZmZlcl90aW1lID4gMCkKKwkJCXBlcmlvZF90aW1lID0gYnVmZmVyX3RpbWUgLyA0OworCQllbHNlCisJCQlwZXJpb2RfZnJhbWVzID0gYnVmZmVyX2ZyYW1lcyAvIDQ7CisJfQorCWlmIChwZXJpb2RfdGltZSA+IDApCisJCWVyciA9IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9uZWFyKGhhbmRsZSwgcGFyYW1zLAorCQkJCQkJCSAgICAgJnBlcmlvZF90aW1lLCAwKTsKKwllbHNlCisJCWVyciA9IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2Rfc2l6ZV9uZWFyKGhhbmRsZSwgcGFyYW1zLAorCQkJCQkJCSAgICAgJnBlcmlvZF9mcmFtZXMsIDApOworCWFzc2VydChlcnIgPj0gMCk7CisJaWYgKGJ1ZmZlcl90aW1lID4gMCkgeworCQllcnIgPSBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3RpbWVfbmVhcihoYW5kbGUsIHBhcmFtcywKKwkJCQkJCQkgICAgICZidWZmZXJfdGltZSwgMCk7CisJfSBlbHNlIHsKKwkJZXJyID0gc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX25lYXIoaGFuZGxlLCBwYXJhbXMsCisJCQkJCQkJICAgICAmYnVmZmVyX2ZyYW1lcyk7CisJfQorCWFzc2VydChlcnIgPj0gMCk7CisJbW9ub3RvbmljID0gc25kX3BjbV9od19wYXJhbXNfaXNfbW9ub3RvbmljKHBhcmFtcyk7CisJY2FuX3BhdXNlID0gc25kX3BjbV9od19wYXJhbXNfY2FuX3BhdXNlKHBhcmFtcyk7CisJZXJyID0gc25kX3BjbV9od19wYXJhbXMoaGFuZGxlLCBwYXJhbXMpOworCWlmIChlcnIgPCAwKSB7CisJCWVycm9yKF8oIlVuYWJsZSB0byBpbnN0YWxsIGh3IHBhcmFtczoiKSk7CisJCXNuZF9wY21faHdfcGFyYW1zX2R1bXAocGFyYW1zLCBsb2cpOworCQlwcmdfZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKwlzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3NpemUocGFyYW1zLCAmY2h1bmtfc2l6ZSwgMCk7CisJc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplKHBhcmFtcywgJmJ1ZmZlcl9zaXplKTsKKwlpZiAoY2h1bmtfc2l6ZSA9PSBidWZmZXJfc2l6ZSkgeworCQllcnJvcihfKCJDYW4ndCB1c2UgcGVyaW9kIGVxdWFsIHRvIGJ1ZmZlciBzaXplICglbHUgPT0gJWx1KSIpLAorCQkgICAgICBjaHVua19zaXplLCBidWZmZXJfc2l6ZSk7CisJCXByZ19leGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCXNuZF9wY21fc3dfcGFyYW1zX2N1cnJlbnQoaGFuZGxlLCBzd3BhcmFtcyk7CisJaWYgKGF2YWlsX21pbiA8IDApCisJCW4gPSBjaHVua19zaXplOworCWVsc2UKKwkJbiA9IChkb3VibGUpIHJhdGUgKiBhdmFpbF9taW4gLyAxMDAwMDAwOworCWVyciA9IHNuZF9wY21fc3dfcGFyYW1zX3NldF9hdmFpbF9taW4oaGFuZGxlLCBzd3BhcmFtcywgbik7CisKKwkvKiByb3VuZCB1cCB0byBjbG9zZXN0IHRyYW5zZmVyIGJvdW5kYXJ5ICovCisJbiA9IGJ1ZmZlcl9zaXplOworCWlmIChzdGFydF9kZWxheSA8PSAwKSB7CisJCXN0YXJ0X3RocmVzaG9sZCA9IG4gKyAoZG91YmxlKSByYXRlICogc3RhcnRfZGVsYXkgLyAxMDAwMDAwOworCX0gZWxzZQorCQlzdGFydF90aHJlc2hvbGQgPSAoZG91YmxlKSByYXRlICogc3RhcnRfZGVsYXkgLyAxMDAwMDAwOworCWlmIChzdGFydF90aHJlc2hvbGQgPCAxKQorCQlzdGFydF90aHJlc2hvbGQgPSAxOworCWlmIChzdGFydF90aHJlc2hvbGQgPiBuKQorCQlzdGFydF90aHJlc2hvbGQgPSBuOworCWVyciA9IHNuZF9wY21fc3dfcGFyYW1zX3NldF9zdGFydF90aHJlc2hvbGQoaGFuZGxlLCBzd3BhcmFtcywgc3RhcnRfdGhyZXNob2xkKTsKKwlhc3NlcnQoZXJyID49IDApOworCWlmIChzdG9wX2RlbGF5IDw9IDApIAorCQlzdG9wX3RocmVzaG9sZCA9IGJ1ZmZlcl9zaXplICsgKGRvdWJsZSkgcmF0ZSAqIHN0b3BfZGVsYXkgLyAxMDAwMDAwOworCWVsc2UKKwkJc3RvcF90aHJlc2hvbGQgPSAoZG91YmxlKSByYXRlICogc3RvcF9kZWxheSAvIDEwMDAwMDA7CisJZXJyID0gc25kX3BjbV9zd19wYXJhbXNfc2V0X3N0b3BfdGhyZXNob2xkKGhhbmRsZSwgc3dwYXJhbXMsIHN0b3BfdGhyZXNob2xkKTsKKwlhc3NlcnQoZXJyID49IDApOworCisJaWYgKHNuZF9wY21fc3dfcGFyYW1zKGhhbmRsZSwgc3dwYXJhbXMpIDwgMCkgeworCQllcnJvcihfKCJ1bmFibGUgdG8gaW5zdGFsbCBzdyBwYXJhbXM6IikpOworCQlzbmRfcGNtX3N3X3BhcmFtc19kdW1wKHN3cGFyYW1zLCBsb2cpOworCQlwcmdfZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKworCWlmICh2ZXJib3NlKQorCQlzbmRfcGNtX2R1bXAoaGFuZGxlLCBsb2cpOworCisJYml0c19wZXJfc2FtcGxlID0gc25kX3BjbV9mb3JtYXRfcGh5c2ljYWxfd2lkdGgoaHdwYXJhbXMuZm9ybWF0KTsKKwliaXRzX3Blcl9mcmFtZSA9IGJpdHNfcGVyX3NhbXBsZSAqIGh3cGFyYW1zLmNoYW5uZWxzOworCWNodW5rX2J5dGVzID0gY2h1bmtfc2l6ZSAqIGJpdHNfcGVyX2ZyYW1lIC8gODsKKwlhdWRpb2J1ZiA9IHJlYWxsb2MoYXVkaW9idWYsIGNodW5rX2J5dGVzKTsKKwlpZiAoYXVkaW9idWYgPT0gTlVMTCkgeworCQllcnJvcihfKCJub3QgZW5vdWdoIG1lbW9yeSIpKTsKKwkJcHJnX2V4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisJLy8gZnByaW50ZihzdGRlcnIsICJyZWFsIGNodW5rX3NpemUgPSAlaSwgZnJhZ3MgPSAlaSwgdG90YWwgPSAlaVxuIiwgY2h1bmtfc2l6ZSwgc2V0dXAuYnVmLmJsb2NrLmZyYWdzLCBzZXR1cC5idWYuYmxvY2suZnJhZ3MgKiBjaHVua19zaXplKTsKKworCS8qIHN0ZXJlbyBWVS1tZXRlciBpc24ndCBhbHdheXMgYXZhaWxhYmxlLi4uICovCisJaWYgKHZ1bWV0ZXIgPT0gVlVNRVRFUl9TVEVSRU8pIHsKKwkJaWYgKGh3cGFyYW1zLmNoYW5uZWxzICE9IDIgfHwgIWludGVybGVhdmVkIHx8IHZlcmJvc2UgPiAyKQorCQkJdnVtZXRlciA9IFZVTUVURVJfTU9OTzsKKwl9CisKKwkvKiBzaG93IG1tYXAgYnVmZmVyIGFycmFnbWVudCAqLworCWlmIChtbWFwX2ZsYWcgJiYgdmVyYm9zZSkgeworCQljb25zdCBzbmRfcGNtX2NoYW5uZWxfYXJlYV90ICphcmVhczsKKwkJc25kX3BjbV91ZnJhbWVzX3Qgb2Zmc2V0LCBzaXplID0gY2h1bmtfc2l6ZTsKKwkJaW50IGk7CisJCWVyciA9IHNuZF9wY21fbW1hcF9iZWdpbihoYW5kbGUsICZhcmVhcywgJm9mZnNldCwgJnNpemUpOworCQlpZiAoZXJyIDwgMCkgeworCQkJZXJyb3IoXygic25kX3BjbV9tbWFwX2JlZ2luIHByb2JsZW06ICVzIiksIHNuZF9zdHJlcnJvcihlcnIpKTsKKwkJCXByZ19leGl0KEVYSVRfRkFJTFVSRSk7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IGh3cGFyYW1zLmNoYW5uZWxzOyBpKyspCisJCQlmcHJpbnRmKHN0ZGVyciwgIm1tYXBfYXJlYVslaV0gPSAlcCwldSwldSAoJXUpXG4iLCBpLCBhcmVhc1tpXS5hZGRyLCBhcmVhc1tpXS5maXJzdCwgYXJlYXNbaV0uc3RlcCwgc25kX3BjbV9mb3JtYXRfcGh5c2ljYWxfd2lkdGgoaHdwYXJhbXMuZm9ybWF0KSk7CisJCS8qIG5vdCByZXF1aXJlZCwgYnV0IGZvciBzdXJlICovCisJCXNuZF9wY21fbW1hcF9jb21taXQoaGFuZGxlLCBvZmZzZXQsIDApOworCX0KKworCWJ1ZmZlcl9mcmFtZXMgPSBidWZmZXJfc2l6ZTsJLyogZm9yIHBvc2l0aW9uIHRlc3QgKi8KK30KKworc3RhdGljIHZvaWQgaW5pdF9zdGRpbih2b2lkKQoreworCXN0cnVjdCB0ZXJtaW9zIHRlcm07CisJbG9uZyBmbGFnczsKKworCWlmICghaW50ZXJhY3RpdmUpCisJCXJldHVybjsKKwl0Y2dldGF0dHIoZmlsZW5vKHN0ZGluKSwgJnRlcm0pOworCXRlcm1fY19sZmxhZyA9IHRlcm0uY19sZmxhZzsKKwlpZiAoZmQgPT0gZmlsZW5vKHN0ZGluKSkKKwkJcmV0dXJuOworCWZsYWdzID0gZmNudGwoZmlsZW5vKHN0ZGluKSwgRl9HRVRGTCk7CisJaWYgKGZsYWdzIDwgMCB8fCBmY250bChmaWxlbm8oc3RkaW4pLCBGX1NFVEZMLCBmbGFnc3xPX05PTkJMT0NLKSA8IDApCisJCWZwcmludGYoc3RkZXJyLCBfKCJzdGRpbiBPX05PTkJMT0NLIGZsYWcgc2V0dXAgZmFpbGVkXG4iKSk7CisJdGVybS5jX2xmbGFnICY9IH5JQ0FOT047CisJdGNzZXRhdHRyKGZpbGVubyhzdGRpbiksIFRDU0FOT1csICZ0ZXJtKTsKK30KKworc3RhdGljIHZvaWQgZG9uZV9zdGRpbih2b2lkKQoreworCXN0cnVjdCB0ZXJtaW9zIHRlcm07CisKKwlpZiAoIWludGVyYWN0aXZlKQorCQlyZXR1cm47CisJaWYgKGZkID09IGZpbGVubyhzdGRpbikgfHwgdGVybV9jX2xmbGFnID09IC0xKQorCQlyZXR1cm47CisJdGNnZXRhdHRyKGZpbGVubyhzdGRpbiksICZ0ZXJtKTsKKwl0ZXJtLmNfbGZsYWcgPSB0ZXJtX2NfbGZsYWc7CisJdGNzZXRhdHRyKGZpbGVubyhzdGRpbiksIFRDU0FOT1csICZ0ZXJtKTsKK30KKworc3RhdGljIHZvaWQgZG9fcGF1c2Uodm9pZCkKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIGNoYXIgYjsKKworCWlmICghY2FuX3BhdXNlKSB7CisJCWZwcmludGYoc3RkZXJyLCBfKCJcclBBVVNFIGNvbW1hbmQgaWdub3JlZCAobm8gaHcgc3VwcG9ydClcbiIpKTsKKwkJcmV0dXJuOworCX0KKwllcnIgPSBzbmRfcGNtX3BhdXNlKGhhbmRsZSwgMSk7CisJaWYgKGVyciA8IDApIHsKKwkJZXJyb3IoXygicGF1c2UgcHVzaCBlcnJvcjogJXMiKSwgc25kX3N0cmVycm9yKGVycikpOworCQlyZXR1cm47CisJfQorCXdoaWxlICgxKSB7CisJCXdoaWxlIChyZWFkKGZpbGVubyhzdGRpbiksICZiLCAxKSAhPSAxKTsKKwkJaWYgKGIgPT0gJyAnIHx8IGIgPT0gJ1xyJykgeworCQkJd2hpbGUgKHJlYWQoZmlsZW5vKHN0ZGluKSwgJmIsIDEpID09IDEpOworCQkJZXJyID0gc25kX3BjbV9wYXVzZShoYW5kbGUsIDApOworCQkJaWYgKGVyciA8IDApCisJCQkJZXJyb3IoXygicGF1c2UgcmVsZWFzZSBlcnJvcjogJXMiKSwgc25kX3N0cmVycm9yKGVycikpOworCQkJcmV0dXJuOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBjaGVja19zdGRpbih2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgYjsKKworCWlmICghaW50ZXJhY3RpdmUpCisJCXJldHVybjsKKwlpZiAoZmQgIT0gZmlsZW5vKHN0ZGluKSkgeworCQl3aGlsZSAocmVhZChmaWxlbm8oc3RkaW4pLCAmYiwgMSkgPT0gMSkgeworCQkJaWYgKGIgPT0gJyAnIHx8IGIgPT0gJ1xyJykgeworCQkJCXdoaWxlIChyZWFkKGZpbGVubyhzdGRpbiksICZiLCAxKSA9PSAxKTsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgXygiXHI9PT0gUEFVU0UgPT09ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikpOworCQkJCWZmbHVzaChzdGRlcnIpOworCQkJZG9fcGF1c2UoKTsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHIiKTsKKwkJCQlmZmx1c2goc3RkZXJyKTsKKwkJCX0KKwkJfQorCX0KK30KKworI2lmbmRlZiB0aW1lcnN1YgorI2RlZmluZQl0aW1lcnN1YihhLCBiLCByZXN1bHQpIFwKK2RvIHsgXAorCShyZXN1bHQpLT50dl9zZWMgPSAoYSktPnR2X3NlYyAtIChiKS0+dHZfc2VjOyBcCisJKHJlc3VsdCktPnR2X3VzZWMgPSAoYSktPnR2X3VzZWMgLSAoYiktPnR2X3VzZWM7IFwKKwlpZiAoKHJlc3VsdCktPnR2X3VzZWMgPCAwKSB7IFwKKwkJLS0ocmVzdWx0KS0+dHZfc2VjOyBcCisJCShyZXN1bHQpLT50dl91c2VjICs9IDEwMDAwMDA7IFwKKwl9IFwKK30gd2hpbGUgKDApCisjZW5kaWYKKworI2lmbmRlZiB0aW1lcm1zdWIKKyNkZWZpbmUJdGltZXJtc3ViKGEsIGIsIHJlc3VsdCkgXAorZG8geyBcCisJKHJlc3VsdCktPnR2X3NlYyA9IChhKS0+dHZfc2VjIC0gKGIpLT50dl9zZWM7IFwKKwkocmVzdWx0KS0+dHZfbnNlYyA9IChhKS0+dHZfbnNlYyAtIChiKS0+dHZfbnNlYzsgXAorCWlmICgocmVzdWx0KS0+dHZfbnNlYyA8IDApIHsgXAorCQktLShyZXN1bHQpLT50dl9zZWM7IFwKKwkJKHJlc3VsdCktPnR2X25zZWMgKz0gMTAwMDAwMDAwMEw7IFwKKwl9IFwKK30gd2hpbGUgKDApCisjZW5kaWYKKworLyogSS9PIGVycm9yIGhhbmRsZXIgKi8KK3N0YXRpYyB2b2lkIHhydW4odm9pZCkKK3sKKwlzbmRfcGNtX3N0YXR1c190ICpzdGF0dXM7CisJaW50IHJlczsKKwkKKwlzbmRfcGNtX3N0YXR1c19hbGxvY2EoJnN0YXR1cyk7CisJaWYgKChyZXMgPSBzbmRfcGNtX3N0YXR1cyhoYW5kbGUsIHN0YXR1cykpPDApIHsKKwkJZXJyb3IoXygic3RhdHVzIGVycm9yOiAlcyIpLCBzbmRfc3RyZXJyb3IocmVzKSk7CisJCXByZ19leGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCWlmIChzbmRfcGNtX3N0YXR1c19nZXRfc3RhdGUoc3RhdHVzKSA9PSBTTkRfUENNX1NUQVRFX1hSVU4pIHsKKwkJaWYgKG1vbm90b25pYykgeworI2lmZGVmIEhBVkVfQ0xPQ0tfR0VUVElNRQorCQkJc3RydWN0IHRpbWVzcGVjIG5vdywgZGlmZiwgdHN0YW1wOworCQkJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZub3cpOworCQkJc25kX3BjbV9zdGF0dXNfZ2V0X3RyaWdnZXJfaHRzdGFtcChzdGF0dXMsICZ0c3RhbXApOworCQkJdGltZXJtc3ViKCZub3csICZ0c3RhbXAsICZkaWZmKTsKKwkJCWZwcmludGYoc3RkZXJyLCBfKCIlcyEhISAoYXQgbGVhc3QgJS4zZiBtcyBsb25nKVxuIiksCisJCQkJc3RyZWFtID09IFNORF9QQ01fU1RSRUFNX1BMQVlCQUNLID8gXygidW5kZXJydW4iKSA6IF8oIm92ZXJydW4iKSwKKwkJCQlkaWZmLnR2X3NlYyAqIDEwMDAgKyBkaWZmLnR2X25zZWMgLyAxMDAwMDAwMC4wKTsKKyNlbHNlCisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzICEhIVxuIiwgXygidW5kZXJydW4iKSk7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCB0aW1ldmFsIG5vdywgZGlmZiwgdHN0YW1wOworCQkJZ2V0dGltZW9mZGF5KCZub3csIDApOworCQkJc25kX3BjbV9zdGF0dXNfZ2V0X3RyaWdnZXJfdHN0YW1wKHN0YXR1cywgJnRzdGFtcCk7CisJCQl0aW1lcnN1Yigmbm93LCAmdHN0YW1wLCAmZGlmZik7CisJCQlmcHJpbnRmKHN0ZGVyciwgXygiJXMhISEgKGF0IGxlYXN0ICUuM2YgbXMgbG9uZylcbiIpLAorCQkJCXN0cmVhbSA9PSBTTkRfUENNX1NUUkVBTV9QTEFZQkFDSyA/IF8oInVuZGVycnVuIikgOiBfKCJvdmVycnVuIiksCisJCQkJZGlmZi50dl9zZWMgKiAxMDAwICsgZGlmZi50dl91c2VjIC8gMTAwMC4wKTsKKwkJfQorCQlpZiAodmVyYm9zZSkgeworCQkJZnByaW50ZihzdGRlcnIsIF8oIlN0YXR1czpcbiIpKTsKKwkJCXNuZF9wY21fc3RhdHVzX2R1bXAoc3RhdHVzLCBsb2cpOworCQl9CisJCWlmICgocmVzID0gc25kX3BjbV9wcmVwYXJlKGhhbmRsZSkpPDApIHsKKwkJCWVycm9yKF8oInhydW46IHByZXBhcmUgZXJyb3I6ICVzIiksIHNuZF9zdHJlcnJvcihyZXMpKTsKKwkJCXByZ19leGl0KEVYSVRfRkFJTFVSRSk7CisJCX0KKwkJcmV0dXJuOwkJLyogb2ssIGRhdGEgc2hvdWxkIGJlIGFjY2VwdGVkIGFnYWluICovCisJfSBpZiAoc25kX3BjbV9zdGF0dXNfZ2V0X3N0YXRlKHN0YXR1cykgPT0gU05EX1BDTV9TVEFURV9EUkFJTklORykgeworCQlpZiAodmVyYm9zZSkgeworCQkJZnByaW50ZihzdGRlcnIsIF8oIlN0YXR1cyhEUkFJTklORyk6XG4iKSk7CisJCQlzbmRfcGNtX3N0YXR1c19kdW1wKHN0YXR1cywgbG9nKTsKKwkJfQorCQlpZiAoc3RyZWFtID09IFNORF9QQ01fU1RSRUFNX0NBUFRVUkUpIHsKKwkJCWZwcmludGYoc3RkZXJyLCBfKCJjYXB0dXJlIHN0cmVhbSBmb3JtYXQgY2hhbmdlPyBhdHRlbXB0aW5nIHJlY292ZXIuLi5cbiIpKTsKKwkJCWlmICgocmVzID0gc25kX3BjbV9wcmVwYXJlKGhhbmRsZSkpPDApIHsKKwkJCQllcnJvcihfKCJ4cnVuKERSQUlOSU5HKTogcHJlcGFyZSBlcnJvcjogJXMiKSwgc25kX3N0cmVycm9yKHJlcykpOworCQkJCXByZ19leGl0KEVYSVRfRkFJTFVSRSk7CisJCQl9CisJCQlyZXR1cm47CisJCX0KKwl9CisJaWYgKHZlcmJvc2UpIHsKKwkJZnByaW50ZihzdGRlcnIsIF8oIlN0YXR1cyhSL1cpOlxuIikpOworCQlzbmRfcGNtX3N0YXR1c19kdW1wKHN0YXR1cywgbG9nKTsKKwl9CisJZXJyb3IoXygicmVhZC93cml0ZSBlcnJvciwgc3RhdGUgPSAlcyIpLCBzbmRfcGNtX3N0YXRlX25hbWUoc25kX3BjbV9zdGF0dXNfZ2V0X3N0YXRlKHN0YXR1cykpKTsKKwlwcmdfZXhpdChFWElUX0ZBSUxVUkUpOworfQorCisvKiBJL08gc3VzcGVuZCBoYW5kbGVyICovCitzdGF0aWMgdm9pZCBzdXNwZW5kKHZvaWQpCit7CisJaW50IHJlczsKKworCWlmICghcXVpZXRfbW9kZSkKKwkJZnByaW50ZihzdGRlcnIsIF8oIlN1c3BlbmRlZC4gVHJ5aW5nIHJlc3VtZS4gIikpOyBmZmx1c2goc3RkZXJyKTsKKwl3aGlsZSAoKHJlcyA9IHNuZF9wY21fcmVzdW1lKGhhbmRsZSkpID09IC1FQUdBSU4pCisJCXNsZWVwKDEpOwkvKiB3YWl0IHVudGlsIHN1c3BlbmQgZmxhZyBpcyByZWxlYXNlZCAqLworCWlmIChyZXMgPCAwKSB7CisJCWlmICghcXVpZXRfbW9kZSkKKwkJCWZwcmludGYoc3RkZXJyLCBfKCJGYWlsZWQuIFJlc3RhcnRpbmcgc3RyZWFtLiAiKSk7IGZmbHVzaChzdGRlcnIpOworCQlpZiAoKHJlcyA9IHNuZF9wY21fcHJlcGFyZShoYW5kbGUpKSA8IDApIHsKKwkJCWVycm9yKF8oInN1c3BlbmQ6IHByZXBhcmUgZXJyb3I6ICVzIiksIHNuZF9zdHJlcnJvcihyZXMpKTsKKwkJCXByZ19leGl0KEVYSVRfRkFJTFVSRSk7CisJCX0KKwl9CisJaWYgKCFxdWlldF9tb2RlKQorCQlmcHJpbnRmKHN0ZGVyciwgXygiRG9uZS5cbiIpKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfdnVfbWV0ZXJfbW9ubyhpbnQgcGVyYywgaW50IG1heHBlcmMpCit7CisJY29uc3QgaW50IGJhcl9sZW5ndGggPSA1MDsKKwljaGFyIGxpbmVbODBdOworCWludCB2YWw7CisKKwlmb3IgKHZhbCA9IDA7IHZhbCA8PSBwZXJjICogYmFyX2xlbmd0aCAvIDEwMCAmJiB2YWwgPCBiYXJfbGVuZ3RoOyB2YWwrKykKKwkJbGluZVt2YWxdID0gJyMnOworCWZvciAoOyB2YWwgPD0gbWF4cGVyYyAqIGJhcl9sZW5ndGggLyAxMDAgJiYgdmFsIDwgYmFyX2xlbmd0aDsgdmFsKyspCisJCWxpbmVbdmFsXSA9ICcgJzsKKwlsaW5lW3ZhbF0gPSAnKyc7CisJZm9yICgrK3ZhbDsgdmFsIDw9IGJhcl9sZW5ndGg7IHZhbCsrKQorCQlsaW5lW3ZhbF0gPSAnICc7CisJaWYgKG1heHBlcmMgPiA5OSkKKwkJc3ByaW50ZihsaW5lICsgdmFsLCAifCBNQVgiKTsKKwllbHNlCisJCXNwcmludGYobGluZSArIHZhbCwgInwgJTAyaSUlIiwgbWF4cGVyYyk7CisJZnB1dHMobGluZSwgc3Rkb3V0KTsKKwlpZiAocGVyYyA+IDEwMCkKKwkJcHJpbnRmKF8oIiAhY2xpcCAgIikpOworfQorCitzdGF0aWMgdm9pZCBwcmludF92dV9tZXRlcl9zdGVyZW8oaW50ICpwZXJjLCBpbnQgKm1heHBlcmMpCit7CisJY29uc3QgaW50IGJhcl9sZW5ndGggPSAzNTsKKwljaGFyIGxpbmVbODBdOworCWludCBjOworCisJbWVtc2V0KGxpbmUsICcgJywgc2l6ZW9mKGxpbmUpIC0gMSk7CisJbGluZVtiYXJfbGVuZ3RoICsgM10gPSAnfCc7CisKKwlmb3IgKGMgPSAwOyBjIDwgMjsgYysrKSB7CisJCWludCBwID0gcGVyY1tjXSAqIGJhcl9sZW5ndGggLyAxMDA7CisJCWNoYXIgdG1wWzRdOworCQlpZiAocCA+IGJhcl9sZW5ndGgpCisJCQlwID0gYmFyX2xlbmd0aDsKKwkJaWYgKGMpCisJCQltZW1zZXQobGluZSArIGJhcl9sZW5ndGggKyA2ICsgMSwgJyMnLCBwKTsKKwkJZWxzZQorCQkJbWVtc2V0KGxpbmUgKyBiYXJfbGVuZ3RoIC0gcCAtIDEsICcjJywgcCk7CisJCXAgPSBtYXhwZXJjW2NdICogYmFyX2xlbmd0aCAvIDEwMDsKKwkJaWYgKHAgPiBiYXJfbGVuZ3RoKQorCQkJcCA9IGJhcl9sZW5ndGg7CisJCWlmIChjKQorCQkJbGluZVtiYXJfbGVuZ3RoICsgNiArIDEgKyBwXSA9ICcrJzsKKwkJZWxzZQorCQkJbGluZVtiYXJfbGVuZ3RoIC0gcCAtIDFdID0gJysnOworCQlpZiAobWF4cGVyY1tjXSA+IDk5KQorCQkJc3ByaW50Zih0bXAsICJNQVgiKTsKKwkJZWxzZQorCQkJc3ByaW50Zih0bXAsICIlMDJkJSUiLCBtYXhwZXJjW2NdKTsKKwkJaWYgKGMpCisJCQltZW1jcHkobGluZSArIGJhcl9sZW5ndGggKyAzICsgMSwgdG1wLCAzKTsKKwkJZWxzZQorCQkJbWVtY3B5KGxpbmUgKyBiYXJfbGVuZ3RoLCB0bXAsIDMpOworCX0KKwlsaW5lW2Jhcl9sZW5ndGggKiAyICsgNiArIDJdID0gMDsKKwlmcHV0cyhsaW5lLCBzdGRvdXQpOworfQorCitzdGF0aWMgdm9pZCBwcmludF92dV9tZXRlcihzaWduZWQgaW50ICpwZXJjLCBzaWduZWQgaW50ICptYXhwZXJjKQoreworCWlmICh2dW1ldGVyID09IFZVTUVURVJfU1RFUkVPKQorCQlwcmludF92dV9tZXRlcl9zdGVyZW8ocGVyYywgbWF4cGVyYyk7CisJZWxzZQorCQlwcmludF92dV9tZXRlcl9tb25vKCpwZXJjLCAqbWF4cGVyYyk7Cit9CisKKy8qIHBlYWsgaGFuZGxlciAqLworc3RhdGljIHZvaWQgY29tcHV0ZV9tYXhfcGVhayh1X2NoYXIgKmRhdGEsIHNpemVfdCBjb3VudCkKK3sKKwlzaWduZWQgaW50IHZhbCwgbWF4LCBwZXJjWzJdLCBtYXhfcGVha1syXTsKKwlzdGF0aWMJaW50CXJ1biA9IDA7CisJc2l6ZV90IG9jb3VudCA9IGNvdW50OworCWludAlmb3JtYXRfbGl0dGxlX2VuZGlhbiA9IHNuZF9wY21fZm9ybWF0X2xpdHRsZV9lbmRpYW4oaHdwYXJhbXMuZm9ybWF0KTsJCisJaW50IGljaGFucywgYzsKKworCWlmICh2dW1ldGVyID09IFZVTUVURVJfU1RFUkVPKQorCQlpY2hhbnMgPSAyOworCWVsc2UKKwkJaWNoYW5zID0gMTsKKworCW1lbXNldChtYXhfcGVhaywgMCwgc2l6ZW9mKG1heF9wZWFrKSk7CisJc3dpdGNoIChiaXRzX3Blcl9zYW1wbGUpIHsKKwljYXNlIDg6IHsKKwkJc2lnbmVkIGNoYXIgKnZhbHAgPSAoc2lnbmVkIGNoYXIgKilkYXRhOworCQlzaWduZWQgY2hhciBtYXNrID0gc25kX3BjbV9mb3JtYXRfc2lsZW5jZShod3BhcmFtcy5mb3JtYXQpOworCQljID0gMDsKKwkJd2hpbGUgKGNvdW50LS0gPiAwKSB7CisJCQl2YWwgPSAqdmFscCsrIF4gbWFzazsKKwkJCXZhbCA9IGFicyh2YWwpOworCQkJaWYgKG1heF9wZWFrW2NdIDwgdmFsKQorCQkJCW1heF9wZWFrW2NdID0gdmFsOworCQkJaWYgKHZ1bWV0ZXIgPT0gVlVNRVRFUl9TVEVSRU8pCisJCQkJYyA9ICFjOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIDE2OiB7CisJCXNpZ25lZCBzaG9ydCAqdmFscCA9IChzaWduZWQgc2hvcnQgKilkYXRhOworCQlzaWduZWQgc2hvcnQgbWFzayA9IHNuZF9wY21fZm9ybWF0X3NpbGVuY2VfMTYoaHdwYXJhbXMuZm9ybWF0KTsKKwkJc2lnbmVkIHNob3J0IHN2YWw7CisKKwkJY291bnQgLz0gMjsKKwkJYyA9IDA7CisJCXdoaWxlIChjb3VudC0tID4gMCkgeworCQkJaWYgKGZvcm1hdF9saXR0bGVfZW5kaWFuKQorCQkJCXN2YWwgPSBsZTE2dG9oKCp2YWxwKTsKKwkJCWVsc2UKKwkJCQlzdmFsID0gYmUxNnRvaCgqdmFscCk7CisJCQlzdmFsID0gYWJzKHN2YWwpIF4gbWFzazsKKwkJCWlmIChtYXhfcGVha1tjXSA8IHN2YWwpCisJCQkJbWF4X3BlYWtbY10gPSBzdmFsOworCQkJdmFscCsrOworCQkJaWYgKHZ1bWV0ZXIgPT0gVlVNRVRFUl9TVEVSRU8pCisJCQkJYyA9ICFjOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIDI0OiB7CisJCXVuc2lnbmVkIGNoYXIgKnZhbHAgPSBkYXRhOworCQlzaWduZWQgaW50IG1hc2sgPSBzbmRfcGNtX2Zvcm1hdF9zaWxlbmNlXzMyKGh3cGFyYW1zLmZvcm1hdCk7CisKKwkJY291bnQgLz0gMzsKKwkJYyA9IDA7CisJCXdoaWxlIChjb3VudC0tID4gMCkgeworCQkJaWYgKGZvcm1hdF9saXR0bGVfZW5kaWFuKSB7CisJCQkJdmFsID0gdmFscFswXSB8ICh2YWxwWzFdPDw4KSB8ICh2YWxwWzJdPDwxNik7CisJCQl9IGVsc2UgeworCQkJCXZhbCA9ICh2YWxwWzBdPDwxNikgfCAodmFscFsxXTw8OCkgfCB2YWxwWzJdOworCQkJfQorCQkJLyogQ29ycmVjdCBzaWduZWQgYml0IGluIDMyLWJpdCB2YWx1ZSAqLworCQkJaWYgKHZhbCAmICgxPDwoYml0c19wZXJfc2FtcGxlLTEpKSkgeworCQkJCXZhbCB8PSAweGZmPDwyNDsJLyogTmVnYXRlIHVwcGVyIGJpdHMgdG9vICovCisJCQl9CisJCQl2YWwgPSBhYnModmFsKSBeIG1hc2s7CisJCQlpZiAobWF4X3BlYWtbY10gPCB2YWwpCisJCQkJbWF4X3BlYWtbY10gPSB2YWw7CisJCQl2YWxwICs9IDM7CisJCQlpZiAodnVtZXRlciA9PSBWVU1FVEVSX1NURVJFTykKKwkJCQljID0gIWM7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgMzI6IHsKKwkJc2lnbmVkIGludCAqdmFscCA9IChzaWduZWQgaW50ICopZGF0YTsKKwkJc2lnbmVkIGludCBtYXNrID0gc25kX3BjbV9mb3JtYXRfc2lsZW5jZV8zMihod3BhcmFtcy5mb3JtYXQpOworCisJCWNvdW50IC89IDQ7CisJCWMgPSAwOworCQl3aGlsZSAoY291bnQtLSA+IDApIHsKKwkJCWlmIChmb3JtYXRfbGl0dGxlX2VuZGlhbikKKwkJCQl2YWwgPSBsZTMydG9oKCp2YWxwKTsKKwkJCWVsc2UKKwkJCQl2YWwgPSBiZTMydG9oKCp2YWxwKTsKKwkJCXZhbCA9IGFicyh2YWwpIF4gbWFzazsKKwkJCWlmIChtYXhfcGVha1tjXSA8IHZhbCkKKwkJCQltYXhfcGVha1tjXSA9IHZhbDsKKwkJCXZhbHArKzsKKwkJCWlmICh2dW1ldGVyID09IFZVTUVURVJfU1RFUkVPKQorCQkJCWMgPSAhYzsKKwkJfQorCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJaWYgKHJ1biA9PSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgXygiVW5zdXBwb3J0ZWQgYml0IHNpemUgJWQuXG4iKSwgKGludCliaXRzX3Blcl9zYW1wbGUpOworCQkJcnVuID0gMTsKKwkJfQorCQlyZXR1cm47CisJfQorCW1heCA9IDEgPDwgKGJpdHNfcGVyX3NhbXBsZS0xKTsKKwlpZiAobWF4IDw9IDApCisJCW1heCA9IDB4N2ZmZmZmZmY7CisKKwlmb3IgKGMgPSAwOyBjIDwgaWNoYW5zOyBjKyspIHsKKwkJaWYgKGJpdHNfcGVyX3NhbXBsZSA+IDE2KQorCQkJcGVyY1tjXSA9IG1heF9wZWFrW2NdIC8gKG1heCAvIDEwMCk7CisJCWVsc2UKKwkJCXBlcmNbY10gPSBtYXhfcGVha1tjXSAqIDEwMCAvIG1heDsKKwl9CisKKwlpZiAoaW50ZXJsZWF2ZWQgJiYgdmVyYm9zZSA8PSAyKSB7CisJCXN0YXRpYyBpbnQgbWF4cGVyY1syXTsKKwkJc3RhdGljIHRpbWVfdCB0PTA7CisJCWNvbnN0IHRpbWVfdCB0dD10aW1lKE5VTEwpOworCQlpZih0dD50KSB7CisJCQl0PXR0OworCQkJbWF4cGVyY1swXSA9IDA7CisJCQltYXhwZXJjWzFdID0gMDsKKwkJfQorCQlmb3IgKGMgPSAwOyBjIDwgaWNoYW5zOyBjKyspCisJCQlpZiAocGVyY1tjXSA+IG1heHBlcmNbY10pCisJCQkJbWF4cGVyY1tjXSA9IHBlcmNbY107CisKKwkJcHV0Y2hhcignXHInKTsKKwkJcHJpbnRfdnVfbWV0ZXIocGVyYywgbWF4cGVyYyk7CisJCWZmbHVzaChzdGRvdXQpOworCX0KKwllbHNlIGlmKHZlcmJvc2U9PTMpIHsKKwkJcHJpbnRmKF8oIk1heCBwZWFrICglbGkgc2FtcGxlcyk6IDB4JTA4eCAiKSwgKGxvbmcpb2NvdW50LCBtYXhfcGVha1swXSk7CisJCWZvciAodmFsID0gMDsgdmFsIDwgMjA7IHZhbCsrKQorCQkJaWYgKHZhbCA8PSBwZXJjWzBdIC8gNSkKKwkJCQlwdXRjaGFyKCcjJyk7CisJCQllbHNlCisJCQkJcHV0Y2hhcignICcpOworCQlwcmludGYoIiAlaSUlXG4iLCBwZXJjWzBdKTsKKwkJZmZsdXNoKHN0ZG91dCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkb190ZXN0X3Bvc2l0aW9uKHZvaWQpCit7CisJc3RhdGljIGxvbmcgY291bnRlciA9IDA7CisJc3RhdGljIHRpbWVfdCB0bXIgPSAtMTsKKwl0aW1lX3Qgbm93OworCXN0YXRpYyBmbG9hdCBhdmFpbHN1bSwgZGVsYXlzdW0sIHNhbXBsZXM7CisJc3RhdGljIHNuZF9wY21fc2ZyYW1lc190IG1heGF2YWlsLCBtYXhkZWxheTsKKwlzdGF0aWMgc25kX3BjbV9zZnJhbWVzX3QgbWluYXZhaWwsIG1pbmRlbGF5OworCXN0YXRpYyBzbmRfcGNtX3NmcmFtZXNfdCBiYWRhdmFpbCA9IDAsIGJhZGRlbGF5ID0gMDsKKwlzbmRfcGNtX3NmcmFtZXNfdCBvdXRvZnJhbmdlOworCXNuZF9wY21fc2ZyYW1lc190IGF2YWlsLCBkZWxheTsKKwlpbnQgZXJyOworCisJZXJyID0gc25kX3BjbV9hdmFpbF9kZWxheShoYW5kbGUsICZhdmFpbCwgJmRlbGF5KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuOworCW91dG9mcmFuZ2UgPSAodGVzdF9jb2VmICogKHNuZF9wY21fc2ZyYW1lc190KWJ1ZmZlcl9mcmFtZXMpIC8gMjsKKwlpZiAoYXZhaWwgPiBvdXRvZnJhbmdlIHx8IGF2YWlsIDwgLW91dG9mcmFuZ2UgfHwKKwkgICAgZGVsYXkgPiBvdXRvZnJhbmdlIHx8IGRlbGF5IDwgLW91dG9mcmFuZ2UpIHsKKwkgIGJhZGF2YWlsID0gYXZhaWw7IGJhZGRlbGF5ID0gZGVsYXk7CisJICBhdmFpbHN1bSA9IGRlbGF5c3VtID0gc2FtcGxlcyA9IDA7CisJICBtYXhhdmFpbCA9IG1heGRlbGF5ID0gMDsKKwkgIG1pbmF2YWlsID0gbWluZGVsYXkgPSBidWZmZXJfZnJhbWVzICogMTY7CisJICBmcHJpbnRmKHN0ZGVyciwgXygiU3VzcGljaW91cyBidWZmZXIgcG9zaXRpb24gKCVsaSB0b3RhbCk6ICIKKwkgIAkiYXZhaWwgPSAlbGksIGRlbGF5ID0gJWxpLCBidWZmZXIgPSAlbGlcbiIpLAorCSAgCSsrY291bnRlciwgKGxvbmcpYXZhaWwsIChsb25nKWRlbGF5LCAobG9uZylidWZmZXJfZnJhbWVzKTsKKwl9IGVsc2UgaWYgKHZlcmJvc2UpIHsKKwkJdGltZSgmbm93KTsKKwkJaWYgKHRtciA9PSAodGltZV90KSAtMSkgeworCQkJdG1yID0gbm93OworCQkJYXZhaWxzdW0gPSBkZWxheXN1bSA9IHNhbXBsZXMgPSAwOworCQkJbWF4YXZhaWwgPSBtYXhkZWxheSA9IDA7CisJCQltaW5hdmFpbCA9IG1pbmRlbGF5ID0gYnVmZmVyX2ZyYW1lcyAqIDE2OworCQl9CisJCWlmIChhdmFpbCA+IG1heGF2YWlsKQorCQkJbWF4YXZhaWwgPSBhdmFpbDsKKwkJaWYgKGRlbGF5ID4gbWF4ZGVsYXkpCisJCQltYXhkZWxheSA9IGRlbGF5OworCQlpZiAoYXZhaWwgPCBtaW5hdmFpbCkKKwkJCW1pbmF2YWlsID0gYXZhaWw7CisJCWlmIChkZWxheSA8IG1pbmRlbGF5KQorCQkJbWluZGVsYXkgPSBkZWxheTsKKwkJYXZhaWxzdW0gKz0gYXZhaWw7CisJCWRlbGF5c3VtICs9IGRlbGF5OworCQlzYW1wbGVzKys7CisJCWlmIChhdmFpbCAhPSAwICYmIG5vdyAhPSB0bXIpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQlVGUE9TOiBhdmclbGkvJWxpICIKKwkJCQkibWluJWxpLyVsaSBtYXglbGkvJWxpICglbGkpICglbGk6JWxpLyVsaSlcbiIsCisJCQkJKGxvbmcpKGF2YWlsc3VtIC8gc2FtcGxlcyksCisJCQkJKGxvbmcpKGRlbGF5c3VtIC8gc2FtcGxlcyksCisJCQkJKGxvbmcpbWluYXZhaWwsIChsb25nKW1pbmRlbGF5LAorCQkJCShsb25nKW1heGF2YWlsLCAobG9uZyltYXhkZWxheSwKKwkJCQkobG9uZylidWZmZXJfZnJhbWVzLAorCQkJCWNvdW50ZXIsIGJhZGF2YWlsLCBiYWRkZWxheSk7CisJCQl0bXIgPSBub3c7CisJCX0KKwl9Cit9CisKKy8qCisgKiAgd3JpdGUgZnVuY3Rpb24KKyAqLworCitzdGF0aWMgc3NpemVfdCBwY21fd3JpdGUodV9jaGFyICpkYXRhLCBzaXplX3QgY291bnQpCit7CisJc3NpemVfdCByOworCXNzaXplX3QgcmVzdWx0ID0gMDsKKworCWlmIChjb3VudCA8IGNodW5rX3NpemUpIHsKKwkJc25kX3BjbV9mb3JtYXRfc2V0X3NpbGVuY2UoaHdwYXJhbXMuZm9ybWF0LCBkYXRhICsgY291bnQgKiBiaXRzX3Blcl9mcmFtZSAvIDgsIChjaHVua19zaXplIC0gY291bnQpICogaHdwYXJhbXMuY2hhbm5lbHMpOworCQljb3VudCA9IGNodW5rX3NpemU7CisJfQorCXdoaWxlIChjb3VudCA+IDApIHsKKwkJaWYgKHRlc3RfcG9zaXRpb24pCisJCQlkb190ZXN0X3Bvc2l0aW9uKCk7CisJCWNoZWNrX3N0ZGluKCk7CisJCXIgPSB3cml0ZWlfZnVuYyhoYW5kbGUsIGRhdGEsIGNvdW50KTsKKwkJaWYgKHRlc3RfcG9zaXRpb24pCisJCQlkb190ZXN0X3Bvc2l0aW9uKCk7CisJCWlmIChyID09IC1FQUdBSU4gfHwgKHIgPj0gMCAmJiAoc2l6ZV90KXIgPCBjb3VudCkpIHsKKwkJCWlmICghdGVzdF9ub3dhaXQpCisJCQkJc25kX3BjbV93YWl0KGhhbmRsZSwgMTAwKTsKKwkJfSBlbHNlIGlmIChyID09IC1FUElQRSkgeworCQkJeHJ1bigpOworCQl9IGVsc2UgaWYgKHIgPT0gLUVTVFJQSVBFKSB7CisJCQlzdXNwZW5kKCk7CisJCX0gZWxzZSBpZiAociA8IDApIHsKKwkJCWVycm9yKF8oIndyaXRlIGVycm9yOiAlcyIpLCBzbmRfc3RyZXJyb3IocikpOworCQkJcHJnX2V4aXQoRVhJVF9GQUlMVVJFKTsKKwkJfQorCQlpZiAociA+IDApIHsKKwkJCWlmICh2dW1ldGVyKQorCQkJCWNvbXB1dGVfbWF4X3BlYWsoZGF0YSwgciAqIGh3cGFyYW1zLmNoYW5uZWxzKTsKKwkJCXJlc3VsdCArPSByOworCQkJY291bnQgLT0gcjsKKwkJCWRhdGEgKz0gciAqIGJpdHNfcGVyX2ZyYW1lIC8gODsKKwkJfQorCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc3NpemVfdCBwY21fd3JpdGV2KHVfY2hhciAqKmRhdGEsIHVuc2lnbmVkIGludCBjaGFubmVscywgc2l6ZV90IGNvdW50KQoreworCXNzaXplX3QgcjsKKwlzaXplX3QgcmVzdWx0ID0gMDsKKworCWlmIChjb3VudCAhPSBjaHVua19zaXplKSB7CisJCXVuc2lnbmVkIGludCBjaGFubmVsOworCQlzaXplX3Qgb2Zmc2V0ID0gY291bnQ7CisJCXNpemVfdCByZW1haW5pbmcgPSBjaHVua19zaXplIC0gY291bnQ7CisJCWZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjaGFubmVsczsgY2hhbm5lbCsrKQorCQkJc25kX3BjbV9mb3JtYXRfc2V0X3NpbGVuY2UoaHdwYXJhbXMuZm9ybWF0LCBkYXRhW2NoYW5uZWxdICsgb2Zmc2V0ICogYml0c19wZXJfc2FtcGxlIC8gOCwgcmVtYWluaW5nKTsKKwkJY291bnQgPSBjaHVua19zaXplOworCX0KKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXVuc2lnbmVkIGludCBjaGFubmVsOworCQl2b2lkICpidWZzW2NoYW5uZWxzXTsKKwkJc2l6ZV90IG9mZnNldCA9IHJlc3VsdDsKKwkJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IGNoYW5uZWxzOyBjaGFubmVsKyspCisJCQlidWZzW2NoYW5uZWxdID0gZGF0YVtjaGFubmVsXSArIG9mZnNldCAqIGJpdHNfcGVyX3NhbXBsZSAvIDg7CisJCWlmICh0ZXN0X3Bvc2l0aW9uKQorCQkJZG9fdGVzdF9wb3NpdGlvbigpOworCQljaGVja19zdGRpbigpOworCQlyID0gd3JpdGVuX2Z1bmMoaGFuZGxlLCBidWZzLCBjb3VudCk7CisJCWlmICh0ZXN0X3Bvc2l0aW9uKQorCQkJZG9fdGVzdF9wb3NpdGlvbigpOworCQlpZiAociA9PSAtRUFHQUlOIHx8IChyID49IDAgJiYgKHNpemVfdClyIDwgY291bnQpKSB7CisJCQlpZiAoIXRlc3Rfbm93YWl0KQorCQkJCXNuZF9wY21fd2FpdChoYW5kbGUsIDEwMCk7CisJCX0gZWxzZSBpZiAociA9PSAtRVBJUEUpIHsKKwkJCXhydW4oKTsKKwkJfSBlbHNlIGlmIChyID09IC1FU1RSUElQRSkgeworCQkJc3VzcGVuZCgpOworCQl9IGVsc2UgaWYgKHIgPCAwKSB7CisJCQllcnJvcihfKCJ3cml0ZXYgZXJyb3I6ICVzIiksIHNuZF9zdHJlcnJvcihyKSk7CisJCQlwcmdfZXhpdChFWElUX0ZBSUxVUkUpOworCQl9CisJCWlmIChyID4gMCkgeworCQkJaWYgKHZ1bWV0ZXIpIHsKKwkJCQlmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgY2hhbm5lbHM7IGNoYW5uZWwrKykKKwkJCQkJY29tcHV0ZV9tYXhfcGVhayhkYXRhW2NoYW5uZWxdLCByKTsKKwkJCX0KKwkJCXJlc3VsdCArPSByOworCQkJY291bnQgLT0gcjsKKwkJfQorCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogIHJlYWQgZnVuY3Rpb24KKyAqLworCitzdGF0aWMgc3NpemVfdCBwY21fcmVhZCh1X2NoYXIgKmRhdGEsIHNpemVfdCByY291bnQpCit7CisJc3NpemVfdCByOworCXNpemVfdCByZXN1bHQgPSAwOworCXNpemVfdCBjb3VudCA9IHJjb3VudDsKKworCWlmIChjb3VudCAhPSBjaHVua19zaXplKSB7CisJCWNvdW50ID0gY2h1bmtfc2l6ZTsKKwl9CisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCWlmICh0ZXN0X3Bvc2l0aW9uKQorCQkJZG9fdGVzdF9wb3NpdGlvbigpOworCQljaGVja19zdGRpbigpOworCQlyID0gcmVhZGlfZnVuYyhoYW5kbGUsIGRhdGEsIGNvdW50KTsKKwkJaWYgKHRlc3RfcG9zaXRpb24pCisJCQlkb190ZXN0X3Bvc2l0aW9uKCk7CisJCWlmIChyID09IC1FQUdBSU4gfHwgKHIgPj0gMCAmJiAoc2l6ZV90KXIgPCBjb3VudCkpIHsKKwkJCWlmICghdGVzdF9ub3dhaXQpCisJCQkJc25kX3BjbV93YWl0KGhhbmRsZSwgMTAwKTsKKwkJfSBlbHNlIGlmIChyID09IC1FUElQRSkgeworCQkJeHJ1bigpOworCQl9IGVsc2UgaWYgKHIgPT0gLUVTVFJQSVBFKSB7CisJCQlzdXNwZW5kKCk7CisJCX0gZWxzZSBpZiAociA8IDApIHsKKwkJCWVycm9yKF8oInJlYWQgZXJyb3I6ICVzIiksIHNuZF9zdHJlcnJvcihyKSk7CisJCQlwcmdfZXhpdChFWElUX0ZBSUxVUkUpOworCQl9CisJCWlmIChyID4gMCkgeworCQkJaWYgKHZ1bWV0ZXIpCisJCQkJY29tcHV0ZV9tYXhfcGVhayhkYXRhLCByICogaHdwYXJhbXMuY2hhbm5lbHMpOworCQkJcmVzdWx0ICs9IHI7CisJCQljb3VudCAtPSByOworCQkJZGF0YSArPSByICogYml0c19wZXJfZnJhbWUgLyA4OworCQl9CisJfQorCXJldHVybiByY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBjbV9yZWFkdih1X2NoYXIgKipkYXRhLCB1bnNpZ25lZCBpbnQgY2hhbm5lbHMsIHNpemVfdCByY291bnQpCit7CisJc3NpemVfdCByOworCXNpemVfdCByZXN1bHQgPSAwOworCXNpemVfdCBjb3VudCA9IHJjb3VudDsKKworCWlmIChjb3VudCAhPSBjaHVua19zaXplKSB7CisJCWNvdW50ID0gY2h1bmtfc2l6ZTsKKwl9CisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXVuc2lnbmVkIGludCBjaGFubmVsOworCQl2b2lkICpidWZzW2NoYW5uZWxzXTsKKwkJc2l6ZV90IG9mZnNldCA9IHJlc3VsdDsKKwkJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IGNoYW5uZWxzOyBjaGFubmVsKyspCisJCQlidWZzW2NoYW5uZWxdID0gZGF0YVtjaGFubmVsXSArIG9mZnNldCAqIGJpdHNfcGVyX3NhbXBsZSAvIDg7CisJCWlmICh0ZXN0X3Bvc2l0aW9uKQorCQkJZG9fdGVzdF9wb3NpdGlvbigpOworCQljaGVja19zdGRpbigpOworCQlyID0gcmVhZG5fZnVuYyhoYW5kbGUsIGJ1ZnMsIGNvdW50KTsKKwkJaWYgKHRlc3RfcG9zaXRpb24pCisJCQlkb190ZXN0X3Bvc2l0aW9uKCk7CisJCWlmIChyID09IC1FQUdBSU4gfHwgKHIgPj0gMCAmJiAoc2l6ZV90KXIgPCBjb3VudCkpIHsKKwkJCWlmICghdGVzdF9ub3dhaXQpCisJCQkJc25kX3BjbV93YWl0KGhhbmRsZSwgMTAwKTsKKwkJfSBlbHNlIGlmIChyID09IC1FUElQRSkgeworCQkJeHJ1bigpOworCQl9IGVsc2UgaWYgKHIgPT0gLUVTVFJQSVBFKSB7CisJCQlzdXNwZW5kKCk7CisJCX0gZWxzZSBpZiAociA8IDApIHsKKwkJCWVycm9yKF8oInJlYWR2IGVycm9yOiAlcyIpLCBzbmRfc3RyZXJyb3IocikpOworCQkJcHJnX2V4aXQoRVhJVF9GQUlMVVJFKTsKKwkJfQorCQlpZiAociA+IDApIHsKKwkJCWlmICh2dW1ldGVyKSB7CisJCQkJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IGNoYW5uZWxzOyBjaGFubmVsKyspCisJCQkJCWNvbXB1dGVfbWF4X3BlYWsoZGF0YVtjaGFubmVsXSwgcik7CisJCQl9CisJCQlyZXN1bHQgKz0gcjsKKwkJCWNvdW50IC09IHI7CisJCX0KKwl9CisJcmV0dXJuIHJjb3VudDsKK30KKworLyoKKyAqICBvaywgbGV0J3MgcGxheSBhIC52b2MgZmlsZQorICovCisKK3N0YXRpYyBzc2l6ZV90IHZvY19wY21fd3JpdGUodV9jaGFyICpkYXRhLCBzaXplX3QgY291bnQpCit7CisJc3NpemVfdCByZXN1bHQgPSBjb3VudCwgcjsKKwlzaXplX3Qgc2l6ZTsKKworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc2l6ZSA9IGNvdW50OworCQlpZiAoc2l6ZSA+IGNodW5rX2J5dGVzIC0gYnVmZmVyX3BvcykKKwkJCXNpemUgPSBjaHVua19ieXRlcyAtIGJ1ZmZlcl9wb3M7CisJCW1lbWNweShhdWRpb2J1ZiArIGJ1ZmZlcl9wb3MsIGRhdGEsIHNpemUpOworCQlkYXRhICs9IHNpemU7CisJCWNvdW50IC09IHNpemU7CisJCWJ1ZmZlcl9wb3MgKz0gc2l6ZTsKKwkJaWYgKChzaXplX3QpYnVmZmVyX3BvcyA9PSBjaHVua19ieXRlcykgeworCQkJaWYgKChzaXplX3QpKHIgPSBwY21fd3JpdGUoYXVkaW9idWYsIGNodW5rX3NpemUpKSAhPSBjaHVua19zaXplKQorCQkJCXJldHVybiByOworCQkJYnVmZmVyX3BvcyA9IDA7CisJCX0KKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgdm9jX3dyaXRlX3NpbGVuY2UodW5zaWduZWQgeCkKK3sKKwl1bnNpZ25lZCBsOworCXVfY2hhciAqYnVmOworCisJYnVmID0gKHVfY2hhciAqKSBtYWxsb2MoY2h1bmtfYnl0ZXMpOworCWlmIChidWYgPT0gTlVMTCkgeworCQllcnJvcihfKCJjYW4ndCBhbGxvY2F0ZSBidWZmZXIgZm9yIHNpbGVuY2UiKSk7CisJCXJldHVybjsJCS8qIG5vdCBmYXRhbCBlcnJvciAqLworCX0KKwlzbmRfcGNtX2Zvcm1hdF9zZXRfc2lsZW5jZShod3BhcmFtcy5mb3JtYXQsIGJ1ZiwgY2h1bmtfc2l6ZSAqIGh3cGFyYW1zLmNoYW5uZWxzKTsKKwl3aGlsZSAoeCA+IDApIHsKKwkJbCA9IHg7CisJCWlmIChsID4gY2h1bmtfc2l6ZSkKKwkJCWwgPSBjaHVua19zaXplOworCQlpZiAodm9jX3BjbV93cml0ZShidWYsIGwpICE9IChzc2l6ZV90KWwpIHsKKwkJCWVycm9yKF8oIndyaXRlIGVycm9yIikpOworCQkJcHJnX2V4aXQoRVhJVF9GQUlMVVJFKTsKKwkJfQorCQl4IC09IGw7CisJfQorCWZyZWUoYnVmKTsKK30KKworc3RhdGljIHZvaWQgdm9jX3BjbV9mbHVzaCh2b2lkKQoreworCWlmIChidWZmZXJfcG9zID4gMCkgeworCQlzaXplX3QgYjsKKwkJaWYgKHNuZF9wY21fZm9ybWF0X3NldF9zaWxlbmNlKGh3cGFyYW1zLmZvcm1hdCwgYXVkaW9idWYgKyBidWZmZXJfcG9zLCBjaHVua19ieXRlcyAtIGJ1ZmZlcl9wb3MgKiA4IC8gYml0c19wZXJfc2FtcGxlKSA8IDApCisJCQlmcHJpbnRmKHN0ZGVyciwgXygidm9jX3BjbV9mbHVzaCAtIHNpbGVuY2UgZXJyb3IiKSk7CisJCWIgPSBjaHVua19zaXplOworCQlpZiAocGNtX3dyaXRlKGF1ZGlvYnVmLCBiKSAhPSAoc3NpemVfdCliKQorCQkJZXJyb3IoXygidm9jX3BjbV9mbHVzaCBlcnJvciIpKTsKKwl9CisJc25kX3BjbV9ub25ibG9jayhoYW5kbGUsIDApOworCXNuZF9wY21fZHJhaW4oaGFuZGxlKTsKKwlzbmRfcGNtX25vbmJsb2NrKGhhbmRsZSwgbm9uYmxvY2spOworfQorCitzdGF0aWMgdm9pZCB2b2NfcGxheShpbnQgZmQsIGludCBvZnMsIGNoYXIgKm5hbWUpCit7CisJaW50IGw7CisJVm9jQmxvY2tUeXBlICpicDsKKwlWb2NWb2ljZURhdGEgKnZkOworCVZvY0V4dEJsb2NrICplYjsKKwlzaXplX3QgbmV4dGJsb2NrLCBpbl9idWZmZXI7CisJdV9jaGFyICpkYXRhLCAqYnVmOworCWNoYXIgd2FzX2V4dGVuZGVkID0gMCwgb3V0cHV0ID0gMDsKKwl1X3Nob3J0ICpzcCwgcmVwZWF0ID0gMDsKKwlzaXplX3Qgc2lsZW5jZTsKKwlvZmY2NF90IGZpbGVwb3MgPSAwOworCisjZGVmaW5lIENPVU5UKHgpCW5leHRibG9jayAtPSB4OyBpbl9idWZmZXIgLT0geDsgZGF0YSArPSB4CisjZGVmaW5lIENPVU5UMSh4KQlpbl9idWZmZXIgLT0geDsgZGF0YSArPSB4CisKKwlkYXRhID0gYnVmID0gKHVfY2hhciAqKW1hbGxvYyg2NCAqIDEwMjQpOworCWJ1ZmZlcl9wb3MgPSAwOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZXJyb3IoXygibWFsbG9jIGVycm9yIikpOworCQlwcmdfZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKwlpZiAoIXF1aWV0X21vZGUpIHsKKwkJZnByaW50ZihzdGRlcnIsIF8oIlBsYXlpbmcgQ3JlYXRpdmUgTGFicyBDaGFubmVsIGZpbGUgJyVzJy4uLlxuIiksIG5hbWUpOworCX0KKwkvKiBmaXJzdCB3ZSB3YXN0ZSB0aGUgcmVzdCBvZiBoZWFkZXIsIHVnbHkgYnV0IHdlIGRvbid0IG5lZWQgc2VlayAqLworCXdoaWxlIChvZnMgPiAoc3NpemVfdCljaHVua19ieXRlcykgeworCQlpZiAoKHNpemVfdClzYWZlX3JlYWQoZmQsIGJ1ZiwgY2h1bmtfYnl0ZXMpICE9IGNodW5rX2J5dGVzKSB7CisJCQllcnJvcihfKCJyZWFkIGVycm9yIikpOworCQkJcHJnX2V4aXQoRVhJVF9GQUlMVVJFKTsKKwkJfQorCQlvZnMgLT0gY2h1bmtfYnl0ZXM7CisJfQorCWlmIChvZnMpIHsKKwkJaWYgKHNhZmVfcmVhZChmZCwgYnVmLCBvZnMpICE9IG9mcykgeworCQkJZXJyb3IoXygicmVhZCBlcnJvciIpKTsKKwkJCXByZ19leGl0KEVYSVRfRkFJTFVSRSk7CisJCX0KKwl9CisJaHdwYXJhbXMuZm9ybWF0ID0gREVGQVVMVF9GT1JNQVQ7CisJaHdwYXJhbXMuY2hhbm5lbHMgPSAxOworCWh3cGFyYW1zLnJhdGUgPSBERUZBVUxUX1NQRUVEOworCXNldF9wYXJhbXMoKTsKKworCWluX2J1ZmZlciA9IG5leHRibG9jayA9IDA7CisJd2hpbGUgKDEpIHsKKwkgICAgICBGaWxsX3RoZV9idWZmZXI6CS8qIG5lZWQgdGhpcyBmb3IgcmVwZWF0ICovCisJCWlmIChpbl9idWZmZXIgPCAzMikgeworCQkJLyogbW92ZSB0aGUgcmVzdCBvZiBidWZmZXIgdG8gcG9zIDAgYW5kIGZpbGwgdGhlIGJ1ZiB1cCAqLworCQkJaWYgKGluX2J1ZmZlcikKKwkJCQltZW1jcHkoYnVmLCBkYXRhLCBpbl9idWZmZXIpOworCQkJZGF0YSA9IGJ1ZjsKKwkJCWlmICgobCA9IHNhZmVfcmVhZChmZCwgYnVmICsgaW5fYnVmZmVyLCBjaHVua19ieXRlcyAtIGluX2J1ZmZlcikpID4gMCkKKwkJCQlpbl9idWZmZXIgKz0gbDsKKwkJCWVsc2UgaWYgKCFpbl9idWZmZXIpIHsKKwkJCQkvKiB0aGUgZmlsZSBpcyB0cnVuY2F0ZWQsIHNvIHNpbXVsYXRlICdUZXJtaW5hdG9yJyAKKwkJCQkgICBhbmQgcmVkdWNlIHRoZSBkYXRhYmxvY2sgZm9yIHNhZmUgbGFuZGluZyAqLworCQkJCW5leHRibG9jayA9IGJ1ZlswXSA9IDA7CisJCQkJaWYgKGwgPT0gLTEpIHsKKwkJCQkJcGVycm9yKG5hbWUpOworCQkJCQlwcmdfZXhpdChFWElUX0ZBSUxVUkUpOworCQkJCX0KKwkJCX0KKwkJfQorCQl3aGlsZSAoIW5leHRibG9jaykgewkvKiB0aGlzIGlzIGEgbmV3IGJsb2NrICovCisJCQlpZiAoaW5fYnVmZmVyIDwgc2l6ZW9mKFZvY0Jsb2NrVHlwZSkpCisJCQkJZ290byBfX2VuZDsKKwkJCWJwID0gKFZvY0Jsb2NrVHlwZSAqKSBkYXRhOworCQkJQ09VTlQxKHNpemVvZihWb2NCbG9ja1R5cGUpKTsKKwkJCW5leHRibG9jayA9IFZPQ19EQVRBTEVOKGJwKTsKKwkJCWlmIChvdXRwdXQgJiYgIXF1aWV0X21vZGUpCisJCQkJZnByaW50ZihzdGRlcnIsICJcbiIpOwkvKiB3cml0ZSAvbiBhZnRlciBBU0NJSS1vdXQgKi8KKwkJCW91dHB1dCA9IDA7CisJCQlzd2l0Y2ggKGJwLT50eXBlKSB7CisJCQljYXNlIDA6CisjaWYgMAorCQkJCWRfcHJpbnRmKCJUZXJtaW5hdG9yXG4iKTsKKyNlbmRpZgorCQkJCXJldHVybjsJCS8qIFZPQy1maWxlIHN0b3AgKi8KKwkJCWNhc2UgMToKKwkJCQl2ZCA9IChWb2NWb2ljZURhdGEgKikgZGF0YTsKKwkJCQlDT1VOVDEoc2l6ZW9mKFZvY1ZvaWNlRGF0YSkpOworCQkJCS8qIHdlIG5lZWQgYSBTWU5DLCBiZWZvcmUgd2UgY2FuIHNldCBuZXcgU1BFRUQsIFNURVJFTyAuLi4gKi8KKworCQkJCWlmICghd2FzX2V4dGVuZGVkKSB7CisJCQkJCWh3cGFyYW1zLnJhdGUgPSAoaW50KSAodmQtPnRjKTsKKwkJCQkJaHdwYXJhbXMucmF0ZSA9IDEwMDAwMDAgLyAoMjU2IC0gaHdwYXJhbXMucmF0ZSk7CisjaWYgMAorCQkJCQlkX3ByaW50ZigiQ2hhbm5lbCBkYXRhICVkIEh6XG4iLCBkc3Bfc3BlZWQpOworI2VuZGlmCisJCQkJCWlmICh2ZC0+cGFjaykgewkJLyogL2Rldi9kc3AgY2FuJ3QgaXQgKi8KKwkJCQkJCWVycm9yKF8oImNhbid0IHBsYXkgcGFja2VkIC52b2MgZmlsZXMiKSk7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQkJaWYgKGh3cGFyYW1zLmNoYW5uZWxzID09IDIpCQkvKiBpZiB3ZSBhcmUgaW4gU3RlcmVvLU1vZGUsIHN3aXRjaCBiYWNrICovCisJCQkJCQlod3BhcmFtcy5jaGFubmVscyA9IDE7CisJCQkJfSBlbHNlIHsJLyogdGhlcmUgd2FzIGV4dGVuZGVkIGJsb2NrICovCisJCQkJCWh3cGFyYW1zLmNoYW5uZWxzID0gMjsKKwkJCQkJd2FzX2V4dGVuZGVkID0gMDsKKwkJCQl9CisJCQkJc2V0X3BhcmFtcygpOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgkvKiBub3RoaW5nIHRvIGRvLCBwdXJlIGRhdGEgKi8KKyNpZiAwCisJCQkJZF9wcmludGYoIkNoYW5uZWwgY29udGludWF0aW9uXG4iKTsKKyNlbmRpZgorCQkJCWJyZWFrOworCQkJY2FzZSAzOgkvKiBhIHNpbGVuY2UgYmxvY2ssIG5vIGRhdGEsIG9ubHkgYSBjb3VudCAqLworCQkJCXNwID0gKHVfc2hvcnQgKikgZGF0YTsKKwkJCQlDT1VOVDEoc2l6ZW9mKHVfc2hvcnQpKTsKKwkJCQlod3BhcmFtcy5yYXRlID0gKGludCkgKCpkYXRhKTsKKwkJCQlDT1VOVDEoMSk7CisJCQkJaHdwYXJhbXMucmF0ZSA9IDEwMDAwMDAgLyAoMjU2IC0gaHdwYXJhbXMucmF0ZSk7CisJCQkJc2V0X3BhcmFtcygpOworCQkJCXNpbGVuY2UgPSAoKChzaXplX3QpICogc3ApICogMTAwMCkgLyBod3BhcmFtcy5yYXRlOworI2lmIDAKKwkJCQlkX3ByaW50ZigiU2lsZW5jZSBmb3IgJWQgbXNcbiIsIChpbnQpIHNpbGVuY2UpOworI2VuZGlmCisJCQkJdm9jX3dyaXRlX3NpbGVuY2UoKnNwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoJLyogYSBtYXJrZXIgZm9yIHN5bmNyb25pc2F0aW9uLCBubyBlZmZlY3QgKi8KKwkJCQlzcCA9ICh1X3Nob3J0ICopIGRhdGE7CisJCQkJQ09VTlQxKHNpemVvZih1X3Nob3J0KSk7CisjaWYgMAorCQkJCWRfcHJpbnRmKCJNYXJrZXIgJWRcbiIsICpzcCk7CisjZW5kaWYKKwkJCQlicmVhazsKKwkJCWNhc2UgNToJLyogQVNDSUkgdGV4dCwgd2UgY29weSB0byBzdGRlcnIgKi8KKwkJCQlvdXRwdXQgPSAxOworI2lmIDAKKwkJCQlkX3ByaW50ZigiQVNDSUkgLSB0ZXh0IDpcbiIpOworI2VuZGlmCisJCQkJYnJlYWs7CisJCQljYXNlIDY6CS8qIHJlcGVhdCBtYXJrZXIsIHNheXMgcmVwZWF0Y291bnQgKi8KKwkJCQkvKiBteSBzcGVjcyBkb24ndCBzYXkgaXQ6IG1heWJlIHRoaXMgY2FuIGJlIHJlY3Vyc2l2ZSwgYnV0CisJCQkJICAgSSBkb24ndCB0aGluayBzb21lYm9keSB1c2UgaXQgKi8KKwkJCQlyZXBlYXQgPSAqKHVfc2hvcnQgKikgZGF0YTsKKwkJCQlDT1VOVDEoc2l6ZW9mKHVfc2hvcnQpKTsKKyNpZiAwCisJCQkJZF9wcmludGYoIlJlcGVhdCBsb29wICVkIHRpbWVzXG4iLCByZXBlYXQpOworI2VuZGlmCisJCQkJaWYgKGZpbGVwb3MgPj0gMCkgewkvKiBpZiA8IDAsIG9uZSBzZWVrIGZhaWxzLCB3aHkgdGVzdCBhbm90aGVyICovCisJCQkJCWlmICgoZmlsZXBvcyA9IGxzZWVrNjQoZmQsIDAsIDEpKSA8IDApIHsKKwkJCQkJCWVycm9yKF8oImNhbid0IHBsYXkgbG9vcHM7ICVzIGlzbid0IHNlZWthYmxlXG4iKSwgbmFtZSk7CisJCQkJCQlyZXBlYXQgPSAwOworCQkJCQl9IGVsc2UgeworCQkJCQkJZmlsZXBvcyAtPSBpbl9idWZmZXI7CS8qIHNldCBmaWxlcG9zIGFmdGVyIHJlcGVhdCAqLworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJcmVwZWF0ID0gMDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDc6CS8qIG9rLCBsZXRzIHJlcGVhdCB0aGF0IGJlIHJld2luZGluZyB0YXBlICovCisJCQkJaWYgKHJlcGVhdCkgeworCQkJCQlpZiAocmVwZWF0ICE9IDB4RkZGRikgeworI2lmIDAKKwkJCQkJCWRfcHJpbnRmKCJSZXBlYXQgbG9vcCAlZFxuIiwgcmVwZWF0KTsKKyNlbmRpZgorCQkJCQkJLS1yZXBlYXQ7CisJCQkJCX0KKyNpZiAwCisJCQkJCWVsc2UKKwkJCQkJCWRfcHJpbnRmKCJOZXZlcmVuZGluZyBsb29wXG4iKTsKKyNlbmRpZgorCQkJCQlsc2VlazY0KGZkLCBmaWxlcG9zLCAwKTsKKwkJCQkJaW5fYnVmZmVyID0gMDsJLyogY2xlYXIgdGhlIGJ1ZmZlciAqLworCQkJCQlnb3RvIEZpbGxfdGhlX2J1ZmZlcjsKKwkJCQl9CisjaWYgMAorCQkJCWVsc2UKKwkJCQkJZF9wcmludGYoIkVuZCByZXBlYXQgbG9vcFxuIik7CisjZW5kaWYKKwkJCQlicmVhazsKKwkJCWNhc2UgODoJLyogdGhlIGV4dGVuc2lvbiB0byBwbGF5IFN0ZXJlbywgSSBoYXZlIFNCIDEuMCA6LSggKi8KKwkJCQl3YXNfZXh0ZW5kZWQgPSAxOworCQkJCWViID0gKFZvY0V4dEJsb2NrICopIGRhdGE7CisJCQkJQ09VTlQxKHNpemVvZihWb2NFeHRCbG9jaykpOworCQkJCWh3cGFyYW1zLnJhdGUgPSAoaW50KSAoZWItPnRjKTsKKwkJCQlod3BhcmFtcy5yYXRlID0gMjU2MDAwMDAwTCAvICg2NTUzNiAtIGh3cGFyYW1zLnJhdGUpOworCQkJCWh3cGFyYW1zLmNoYW5uZWxzID0gZWItPm1vZGUgPT0gVk9DX01PREVfU1RFUkVPID8gMiA6IDE7CisJCQkJaWYgKGh3cGFyYW1zLmNoYW5uZWxzID09IDIpCisJCQkJCWh3cGFyYW1zLnJhdGUgPSBod3BhcmFtcy5yYXRlID4+IDE7CisJCQkJaWYgKGViLT5wYWNrKSB7CQkvKiAvZGV2L2RzcCBjYW4ndCBpdCAqLworCQkJCQllcnJvcihfKCJjYW4ndCBwbGF5IHBhY2tlZCAudm9jIGZpbGVzIikpOworCQkJCQlyZXR1cm47CisJCQkJfQorI2lmIDAKKwkJCQlkX3ByaW50ZigiRXh0ZW5kZWQgYmxvY2sgJXMgJWQgSHpcbiIsCisJCQkJCSAoZWItPm1vZGUgPyAiU3RlcmVvIiA6ICJNb25vIiksIGRzcF9zcGVlZCk7CisjZW5kaWYKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZXJyb3IoXygidW5rbm93biBibG9ja3R5cGUgJWQuIHRlcm1pbmF0ZS4iKSwgYnAtPnR5cGUpOworCQkJCXJldHVybjsKKwkJCX0JLyogc3dpdGNoIChicC0+dHlwZSkgKi8KKwkJfQkJLyogd2hpbGUgKCEgbmV4dGJsb2NrKSAgKi8KKwkJLyogcHV0IG5leHRibG9jayBkYXRhIGJ5dGVzIHRvIGRzcCAqLworCQlsID0gaW5fYnVmZmVyOworCQlpZiAobmV4dGJsb2NrIDwgKHNpemVfdClsKQorCQkJbCA9IG5leHRibG9jazsKKwkJaWYgKGwpIHsKKwkJCWlmIChvdXRwdXQgJiYgIXF1aWV0X21vZGUpIHsKKwkJCQlpZiAod3JpdGUoMiwgZGF0YSwgbCkgIT0gbCkgewkvKiB0byBzdGRlcnIgKi8KKwkJCQkJZXJyb3IoXygid3JpdGUgZXJyb3IiKSk7CisJCQkJCXByZ19leGl0KEVYSVRfRkFJTFVSRSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAodm9jX3BjbV93cml0ZShkYXRhLCBsKSAhPSBsKSB7CisJCQkJCWVycm9yKF8oIndyaXRlIGVycm9yIikpOworCQkJCQlwcmdfZXhpdChFWElUX0ZBSUxVUkUpOworCQkJCX0KKwkJCX0KKwkJCUNPVU5UKGwpOworCQl9CisJfQkJCS8qIHdoaWxlKDEpICovCisgICAgICBfX2VuZDoKKyAgICAgICAgdm9jX3BjbV9mbHVzaCgpOworICAgICAgICBmcmVlKGJ1Zik7Cit9CisvKiB0aGF0IHdhcyBhIGJpZyBvbmUsIHBlcmhhcHMgc29tZWJvZHkgc3BsaXQgaXQgOi0pICovCisKKy8qIHNldHRpbmcgdGhlIGdsb2JhbHMgZm9yIHBsYXlpbmcgcmF3IGRhdGEgKi8KK3N0YXRpYyB2b2lkIGluaXRfcmF3X2RhdGEodm9pZCkKK3sKKwlod3BhcmFtcyA9IHJod3BhcmFtczsKK30KKworLyogY2FsY3VsYXRlIHRoZSBkYXRhIGNvdW50IHRvIHJlYWQgZnJvbS90byBkc3AgKi8KK3N0YXRpYyBvZmY2NF90IGNhbGNfY291bnQodm9pZCkKK3sKKwlvZmY2NF90IGNvdW50OworCisJaWYgKHRpbWVsaW1pdCA9PSAwKSB7CisJCWNvdW50ID0gcGJyZWNfY291bnQ7CisJfSBlbHNlIHsKKwkJY291bnQgPSBzbmRfcGNtX2Zvcm1hdF9zaXplKGh3cGFyYW1zLmZvcm1hdCwgaHdwYXJhbXMucmF0ZSAqIGh3cGFyYW1zLmNoYW5uZWxzKTsKKwkJY291bnQgKj0gKG9mZjY0X3QpdGltZWxpbWl0OworCX0KKwlyZXR1cm4gY291bnQgPCBwYnJlY19jb3VudCA/IGNvdW50IDogcGJyZWNfY291bnQ7Cit9CisKKy8qIHdyaXRlIGEgLlZPQy1oZWFkZXIgKi8KK3N0YXRpYyB2b2lkIGJlZ2luX3ZvYyhpbnQgZmQsIHNpemVfdCBjbnQpCit7CisJVm9jSGVhZGVyIHZoOworCVZvY0Jsb2NrVHlwZSBidDsKKwlWb2NWb2ljZURhdGEgdmQ7CisJVm9jRXh0QmxvY2sgZWI7CisKKwltZW1jcHkodmgubWFnaWMsIFZPQ19NQUdJQ19TVFJJTkcsIDIwKTsKKwl2aC5oZWFkZXJsZW4gPSBMRV9TSE9SVChzaXplb2YoVm9jSGVhZGVyKSk7CisJdmgudmVyc2lvbiA9IExFX1NIT1JUKFZPQ19BQ1RVQUxfVkVSU0lPTik7CisJdmguY29kZWRfdmVyID0gTEVfU0hPUlQoMHgxMjMzIC0gVk9DX0FDVFVBTF9WRVJTSU9OKTsKKworCWlmICh3cml0ZShmZCwgJnZoLCBzaXplb2YoVm9jSGVhZGVyKSkgIT0gc2l6ZW9mKFZvY0hlYWRlcikpIHsKKwkJZXJyb3IoXygid3JpdGUgZXJyb3IiKSk7CisJCXByZ19leGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCWlmIChod3BhcmFtcy5jaGFubmVscyA+IDEpIHsKKwkJLyogd3JpdGUgYW4gZXh0ZW5kZWQgYmxvY2sgKi8KKwkJYnQudHlwZSA9IDg7CisJCWJ0LmRhdGFsZW4gPSA0OworCQlidC5kYXRhbGVuX20gPSBidC5kYXRhbGVuX2ggPSAwOworCQlpZiAod3JpdGUoZmQsICZidCwgc2l6ZW9mKFZvY0Jsb2NrVHlwZSkpICE9IHNpemVvZihWb2NCbG9ja1R5cGUpKSB7CisJCQllcnJvcihfKCJ3cml0ZSBlcnJvciIpKTsKKwkJCXByZ19leGl0KEVYSVRfRkFJTFVSRSk7CisJCX0KKwkJZWIudGMgPSBMRV9TSE9SVCg2NTUzNiAtIDI1NjAwMDAwMEwgLyAoaHdwYXJhbXMucmF0ZSA8PCAxKSk7CisJCWViLnBhY2sgPSAwOworCQllYi5tb2RlID0gMTsKKwkJaWYgKHdyaXRlKGZkLCAmZWIsIHNpemVvZihWb2NFeHRCbG9jaykpICE9IHNpemVvZihWb2NFeHRCbG9jaykpIHsKKwkJCWVycm9yKF8oIndyaXRlIGVycm9yIikpOworCQkJcHJnX2V4aXQoRVhJVF9GQUlMVVJFKTsKKwkJfQorCX0KKwlidC50eXBlID0gMTsKKwljbnQgKz0gc2l6ZW9mKFZvY1ZvaWNlRGF0YSk7CS8qIENoYW5uZWxfZGF0YSBibG9jayBmb2xsb3dzICovCisJYnQuZGF0YWxlbiA9ICh1X2NoYXIpIChjbnQgJiAweEZGKTsKKwlidC5kYXRhbGVuX20gPSAodV9jaGFyKSAoKGNudCAmIDB4RkYwMCkgPj4gOCk7CisJYnQuZGF0YWxlbl9oID0gKHVfY2hhcikgKChjbnQgJiAweEZGMDAwMCkgPj4gMTYpOworCWlmICh3cml0ZShmZCwgJmJ0LCBzaXplb2YoVm9jQmxvY2tUeXBlKSkgIT0gc2l6ZW9mKFZvY0Jsb2NrVHlwZSkpIHsKKwkJZXJyb3IoXygid3JpdGUgZXJyb3IiKSk7CisJCXByZ19leGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCXZkLnRjID0gKHVfY2hhcikgKDI1NiAtICgxMDAwMDAwIC8gaHdwYXJhbXMucmF0ZSkpOworCXZkLnBhY2sgPSAwOworCWlmICh3cml0ZShmZCwgJnZkLCBzaXplb2YoVm9jVm9pY2VEYXRhKSkgIT0gc2l6ZW9mKFZvY1ZvaWNlRGF0YSkpIHsKKwkJZXJyb3IoXygid3JpdGUgZXJyb3IiKSk7CisJCXByZ19leGl0KEVYSVRfRkFJTFVSRSk7CisJfQorfQorCisvKiB3cml0ZSBhIFdBVkUtaGVhZGVyICovCitzdGF0aWMgdm9pZCBiZWdpbl93YXZlKGludCBmZCwgc2l6ZV90IGNudCkKK3sKKwlXYXZlSGVhZGVyIGg7CisJV2F2ZUZtdEJvZHkgZjsKKwlXYXZlQ2h1bmtIZWFkZXIgY2YsIGNkOworCWludCBiaXRzOworCXVfaW50IHRtcDsKKwl1X3Nob3J0IHRtcDI7CisKKwkvKiBXQVZFIGNhbm5vdCBoYW5kbGUgZ3JlYXRlciB0aGFuIDMyYml0IChzaWduZWQ/KSBpbnQgKi8KKwlpZiAoY250ID09IChzaXplX3QpLTIpCisJCWNudCA9IDB4N2ZmZmZmMDA7CisKKwliaXRzID0gODsKKwlzd2l0Y2ggKCh1bnNpZ25lZCBsb25nKSBod3BhcmFtcy5mb3JtYXQpIHsKKwljYXNlIFNORF9QQ01fRk9STUFUX1U4OgorCQliaXRzID0gODsKKwkJYnJlYWs7CisJY2FzZSBTTkRfUENNX0ZPUk1BVF9TMTZfTEU6CisJCWJpdHMgPSAxNjsKKwkJYnJlYWs7CisJY2FzZSBTTkRfUENNX0ZPUk1BVF9TMzJfTEU6CisgICAgICAgIGNhc2UgU05EX1BDTV9GT1JNQVRfRkxPQVRfTEU6CisJCWJpdHMgPSAzMjsKKwkJYnJlYWs7CisJY2FzZSBTTkRfUENNX0ZPUk1BVF9TMjRfTEU6CisJY2FzZSBTTkRfUENNX0ZPUk1BVF9TMjRfM0xFOgorCQliaXRzID0gMjQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVycm9yKF8oIldhdmUgZG9lc24ndCBzdXBwb3J0ICVzIGZvcm1hdC4uLiIpLCBzbmRfcGNtX2Zvcm1hdF9uYW1lKGh3cGFyYW1zLmZvcm1hdCkpOworCQlwcmdfZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKwloLm1hZ2ljID0gV0FWX1JJRkY7CisJdG1wID0gY250ICsgc2l6ZW9mKFdhdmVIZWFkZXIpICsgc2l6ZW9mKFdhdmVDaHVua0hlYWRlcikgKyBzaXplb2YoV2F2ZUZtdEJvZHkpICsgc2l6ZW9mKFdhdmVDaHVua0hlYWRlcikgLSA4OworCWgubGVuZ3RoID0gTEVfSU5UKHRtcCk7CisJaC50eXBlID0gV0FWX1dBVkU7CisKKwljZi50eXBlID0gV0FWX0ZNVDsKKwljZi5sZW5ndGggPSBMRV9JTlQoMTYpOworCisgICAgICAgIGlmIChod3BhcmFtcy5mb3JtYXQgPT0gU05EX1BDTV9GT1JNQVRfRkxPQVRfTEUpCisgICAgICAgICAgICAgICAgZi5mb3JtYXQgPSBMRV9TSE9SVChXQVZfRk1UX0lFRUVfRkxPQVQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZi5mb3JtYXQgPSBMRV9TSE9SVChXQVZfRk1UX1BDTSk7CisJZi5jaGFubmVscyA9IExFX1NIT1JUKGh3cGFyYW1zLmNoYW5uZWxzKTsKKwlmLnNhbXBsZV9mcSA9IExFX0lOVChod3BhcmFtcy5yYXRlKTsKKyNpZiAwCisJdG1wMiA9IChzYW1wbGVzaXplID09IDgpID8gMSA6IDI7CisJZi5ieXRlX3Bfc3BsID0gTEVfU0hPUlQodG1wMik7CisJdG1wID0gZHNwX3NwZWVkICogaHdwYXJhbXMuY2hhbm5lbHMgKiAodV9pbnQpIHRtcDI7CisjZWxzZQorCXRtcDIgPSBod3BhcmFtcy5jaGFubmVscyAqIHNuZF9wY21fZm9ybWF0X3BoeXNpY2FsX3dpZHRoKGh3cGFyYW1zLmZvcm1hdCkgLyA4OworCWYuYnl0ZV9wX3NwbCA9IExFX1NIT1JUKHRtcDIpOworCXRtcCA9ICh1X2ludCkgdG1wMiAqIGh3cGFyYW1zLnJhdGU7CisjZW5kaWYKKwlmLmJ5dGVfcF9zZWMgPSBMRV9JTlQodG1wKTsKKwlmLmJpdF9wX3NwbCA9IExFX1NIT1JUKGJpdHMpOworCisJY2QudHlwZSA9IFdBVl9EQVRBOworCWNkLmxlbmd0aCA9IExFX0lOVChjbnQpOworCisJaWYgKHdyaXRlKGZkLCAmaCwgc2l6ZW9mKFdhdmVIZWFkZXIpKSAhPSBzaXplb2YoV2F2ZUhlYWRlcikgfHwKKwkgICAgd3JpdGUoZmQsICZjZiwgc2l6ZW9mKFdhdmVDaHVua0hlYWRlcikpICE9IHNpemVvZihXYXZlQ2h1bmtIZWFkZXIpIHx8CisJICAgIHdyaXRlKGZkLCAmZiwgc2l6ZW9mKFdhdmVGbXRCb2R5KSkgIT0gc2l6ZW9mKFdhdmVGbXRCb2R5KSB8fAorCSAgICB3cml0ZShmZCwgJmNkLCBzaXplb2YoV2F2ZUNodW5rSGVhZGVyKSkgIT0gc2l6ZW9mKFdhdmVDaHVua0hlYWRlcikpIHsKKwkJZXJyb3IoXygid3JpdGUgZXJyb3IiKSk7CisJCXByZ19leGl0KEVYSVRfRkFJTFVSRSk7CisJfQorfQorCisvKiB3cml0ZSBhIEF1LWhlYWRlciAqLworc3RhdGljIHZvaWQgYmVnaW5fYXUoaW50IGZkLCBzaXplX3QgY250KQoreworCUF1SGVhZGVyIGFoOworCisJYWgubWFnaWMgPSBBVV9NQUdJQzsKKwlhaC5oZHJfc2l6ZSA9IEJFX0lOVCgyNCk7CisJYWguZGF0YV9zaXplID0gQkVfSU5UKGNudCk7CisJc3dpdGNoICgodW5zaWduZWQgbG9uZykgaHdwYXJhbXMuZm9ybWF0KSB7CisJY2FzZSBTTkRfUENNX0ZPUk1BVF9NVV9MQVc6CisJCWFoLmVuY29kaW5nID0gQkVfSU5UKEFVX0ZNVF9VTEFXKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfUENNX0ZPUk1BVF9VODoKKwkJYWguZW5jb2RpbmcgPSBCRV9JTlQoQVVfRk1UX0xJTjgpOworCQlicmVhazsKKwljYXNlIFNORF9QQ01fRk9STUFUX1MxNl9CRToKKwkJYWguZW5jb2RpbmcgPSBCRV9JTlQoQVVfRk1UX0xJTjE2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyb3IoXygiU3BhcmMgQXVkaW8gZG9lc24ndCBzdXBwb3J0ICVzIGZvcm1hdC4uLiIpLCBzbmRfcGNtX2Zvcm1hdF9uYW1lKGh3cGFyYW1zLmZvcm1hdCkpOworCQlwcmdfZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKwlhaC5zYW1wbGVfcmF0ZSA9IEJFX0lOVChod3BhcmFtcy5yYXRlKTsKKwlhaC5jaGFubmVscyA9IEJFX0lOVChod3BhcmFtcy5jaGFubmVscyk7CisJaWYgKHdyaXRlKGZkLCAmYWgsIHNpemVvZihBdUhlYWRlcikpICE9IHNpemVvZihBdUhlYWRlcikpIHsKKwkJZXJyb3IoXygid3JpdGUgZXJyb3IiKSk7CisJCXByZ19leGl0KEVYSVRfRkFJTFVSRSk7CisJfQorfQorCisvKiBjbG9zaW5nIC5WT0MgKi8KK3N0YXRpYyB2b2lkIGVuZF92b2MoaW50IGZkKQoreworCW9mZjY0X3QgbGVuZ3RoX3NlZWs7CisJVm9jQmxvY2tUeXBlIGJ0OworCXNpemVfdCBjbnQ7CisJY2hhciBkdW1teSA9IDA7CQkvKiBXcml0ZSBhIFRlcm1pbmF0b3IgKi8KKworCWlmICh3cml0ZShmZCwgJmR1bW15LCAxKSAhPSAxKSB7CisJCWVycm9yKF8oIndyaXRlIGVycm9yIikpOworCQlwcmdfZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKwlsZW5ndGhfc2VlayA9IHNpemVvZihWb2NIZWFkZXIpOworCWlmIChod3BhcmFtcy5jaGFubmVscyA+IDEpCisJCWxlbmd0aF9zZWVrICs9IHNpemVvZihWb2NCbG9ja1R5cGUpICsgc2l6ZW9mKFZvY0V4dEJsb2NrKTsKKwlidC50eXBlID0gMTsKKwljbnQgPSBmZGNvdW50OworCWNudCArPSBzaXplb2YoVm9jVm9pY2VEYXRhKTsJLyogQ2hhbm5lbF9kYXRhIGJsb2NrIGZvbGxvd3MgKi8KKwlpZiAoY250ID4gMHgwMGZmZmZmZikKKwkJY250ID0gMHgwMGZmZmZmZjsKKwlidC5kYXRhbGVuID0gKHVfY2hhcikgKGNudCAmIDB4RkYpOworCWJ0LmRhdGFsZW5fbSA9ICh1X2NoYXIpICgoY250ICYgMHhGRjAwKSA+PiA4KTsKKwlidC5kYXRhbGVuX2ggPSAodV9jaGFyKSAoKGNudCAmIDB4RkYwMDAwKSA+PiAxNik7CisJaWYgKGxzZWVrNjQoZmQsIGxlbmd0aF9zZWVrLCBTRUVLX1NFVCkgPT0gbGVuZ3RoX3NlZWspCisJCXdyaXRlKGZkLCAmYnQsIHNpemVvZihWb2NCbG9ja1R5cGUpKTsKKwlpZiAoZmQgIT0gMSkKKwkJY2xvc2UoZmQpOworfQorCitzdGF0aWMgdm9pZCBlbmRfd2F2ZShpbnQgZmQpCit7CQkJCS8qIG9ubHkgY2xvc2Ugb3V0cHV0ICovCisJV2F2ZUNodW5rSGVhZGVyIGNkOworCW9mZjY0X3QgbGVuZ3RoX3NlZWs7CisJb2ZmNjRfdCBmaWxlbGVuOworCXVfaW50IHJpZmZsZW47CisJCisJbGVuZ3RoX3NlZWsgPSBzaXplb2YoV2F2ZUhlYWRlcikgKworCQkgICAgICBzaXplb2YoV2F2ZUNodW5rSGVhZGVyKSArCisJCSAgICAgIHNpemVvZihXYXZlRm10Qm9keSk7CisJY2QudHlwZSA9IFdBVl9EQVRBOworCWNkLmxlbmd0aCA9IGZkY291bnQgPiAweDdmZmZmZmZmID8gTEVfSU5UKDB4N2ZmZmZmZmYpIDogTEVfSU5UKGZkY291bnQpOworCWZpbGVsZW4gPSBmZGNvdW50ICsgMipzaXplb2YoV2F2ZUNodW5rSGVhZGVyKSArIHNpemVvZihXYXZlRm10Qm9keSkgKyA0OworCXJpZmZsZW4gPSBmaWxlbGVuID4gMHg3ZmZmZmZmZiA/IExFX0lOVCgweDdmZmZmZmZmKSA6IExFX0lOVChmaWxlbGVuKTsKKwlpZiAobHNlZWs2NChmZCwgNCwgU0VFS19TRVQpID09IDQpCisJCXdyaXRlKGZkLCAmcmlmZmxlbiwgNCk7CisJaWYgKGxzZWVrNjQoZmQsIGxlbmd0aF9zZWVrLCBTRUVLX1NFVCkgPT0gbGVuZ3RoX3NlZWspCisJCXdyaXRlKGZkLCAmY2QsIHNpemVvZihXYXZlQ2h1bmtIZWFkZXIpKTsKKwlpZiAoZmQgIT0gMSkKKwkJY2xvc2UoZmQpOworfQorCitzdGF0aWMgdm9pZCBlbmRfYXUoaW50IGZkKQorewkJCQkvKiBvbmx5IGNsb3NlIG91dHB1dCAqLworCUF1SGVhZGVyIGFoOworCW9mZjY0X3QgbGVuZ3RoX3NlZWs7CisJCisJbGVuZ3RoX3NlZWsgPSAoY2hhciAqKSZhaC5kYXRhX3NpemUgLSAoY2hhciAqKSZhaDsKKwlhaC5kYXRhX3NpemUgPSBmZGNvdW50ID4gMHhmZmZmZmZmZiA/IDB4ZmZmZmZmZmYgOiBCRV9JTlQoZmRjb3VudCk7CisJaWYgKGxzZWVrNjQoZmQsIGxlbmd0aF9zZWVrLCBTRUVLX1NFVCkgPT0gbGVuZ3RoX3NlZWspCisJCXdyaXRlKGZkLCAmYWguZGF0YV9zaXplLCBzaXplb2YoYWguZGF0YV9zaXplKSk7CisJaWYgKGZkICE9IDEpCisJCWNsb3NlKGZkKTsKK30KKworc3RhdGljIHZvaWQgaGVhZGVyKGludCBydHlwZSwgY2hhciAqbmFtZSkKK3sKKwlpZiAoIXF1aWV0X21vZGUpIHsKKwkJaWYgKCEgbmFtZSkKKwkJCW5hbWUgPSAoc3RyZWFtID09IFNORF9QQ01fU1RSRUFNX1BMQVlCQUNLKSA/ICJzdGRvdXQiIDogInN0ZGluIjsKKwkJZnByaW50ZihzdGRlcnIsICIlcyAlcyAnJXMnIDogIiwKKwkJCShzdHJlYW0gPT0gU05EX1BDTV9TVFJFQU1fUExBWUJBQ0spID8gXygiUGxheWluZyIpIDogXygiUmVjb3JkaW5nIiksCisJCQlnZXR0ZXh0KGZtdF9yZWNfdGFibGVbcnR5cGVdLndoYXQpLAorCQkJbmFtZSk7CisJCWZwcmludGYoc3RkZXJyLCAiJXMsICIsIHNuZF9wY21fZm9ybWF0X2Rlc2NyaXB0aW9uKGh3cGFyYW1zLmZvcm1hdCkpOworCQlmcHJpbnRmKHN0ZGVyciwgXygiUmF0ZSAlZCBIeiwgIiksIGh3cGFyYW1zLnJhdGUpOworCQlpZiAoaHdwYXJhbXMuY2hhbm5lbHMgPT0gMSkKKwkJCWZwcmludGYoc3RkZXJyLCBfKCJNb25vIikpOworCQllbHNlIGlmIChod3BhcmFtcy5jaGFubmVscyA9PSAyKQorCQkJZnByaW50ZihzdGRlcnIsIF8oIlN0ZXJlbyIpKTsKKwkJZWxzZQorCQkJZnByaW50ZihzdGRlcnIsIF8oIkNoYW5uZWxzICVpIiksIGh3cGFyYW1zLmNoYW5uZWxzKTsKKwkJZnByaW50ZihzdGRlcnIsICJcbiIpOworCX0KK30KKworLyogcGxheWluZyByYXcgZGF0YSAqLworCitzdGF0aWMgdm9pZCBwbGF5YmFja19nbyhpbnQgZmQsIHNpemVfdCBsb2FkZWQsIG9mZjY0X3QgY291bnQsIGludCBydHlwZSwgY2hhciAqbmFtZSkKK3sKKwlpbnQgbCwgcjsKKwlvZmY2NF90IHdyaXR0ZW4gPSAwOworCW9mZjY0X3QgYzsKKworCWhlYWRlcihydHlwZSwgbmFtZSk7CisJc2V0X3BhcmFtcygpOworCisJd2hpbGUgKGxvYWRlZCA+IGNodW5rX2J5dGVzICYmIHdyaXR0ZW4gPCBjb3VudCkgeworCQlpZiAocGNtX3dyaXRlKGF1ZGlvYnVmICsgd3JpdHRlbiwgY2h1bmtfc2l6ZSkgPD0gMCkKKwkJCXJldHVybjsKKwkJd3JpdHRlbiArPSBjaHVua19ieXRlczsKKwkJbG9hZGVkIC09IGNodW5rX2J5dGVzOworCX0KKwlpZiAod3JpdHRlbiA+IDAgJiYgbG9hZGVkID4gMCkKKwkJbWVtbW92ZShhdWRpb2J1ZiwgYXVkaW9idWYgKyB3cml0dGVuLCBsb2FkZWQpOworCisJbCA9IGxvYWRlZDsKKwl3aGlsZSAod3JpdHRlbiA8IGNvdW50KSB7CisJCWRvIHsKKwkJCWMgPSBjb3VudCAtIHdyaXR0ZW47CisJCQlpZiAoYyA+IGNodW5rX2J5dGVzKQorCQkJCWMgPSBjaHVua19ieXRlczsKKwkJCWMgLT0gbDsKKworCQkJaWYgKGMgPT0gMCkKKwkJCQlicmVhazsKKwkJCXIgPSBzYWZlX3JlYWQoZmQsIGF1ZGlvYnVmICsgbCwgYyk7CisJCQlpZiAociA8IDApIHsKKwkJCQlwZXJyb3IobmFtZSk7CisJCQkJcHJnX2V4aXQoRVhJVF9GQUlMVVJFKTsKKwkJCX0KKwkJCWZkY291bnQgKz0gcjsKKwkJCWlmIChyID09IDApCisJCQkJYnJlYWs7CisJCQlsICs9IHI7CisJCX0gd2hpbGUgKChzaXplX3QpbCA8IGNodW5rX2J5dGVzKTsKKwkJbCA9IGwgKiA4IC8gYml0c19wZXJfZnJhbWU7CisJCXIgPSBwY21fd3JpdGUoYXVkaW9idWYsIGwpOworCQlpZiAociAhPSBsKQorCQkJYnJlYWs7CisJCXIgPSByICogYml0c19wZXJfZnJhbWUgLyA4OworCQl3cml0dGVuICs9IHI7CisJCWwgPSAwOworCX0KKwlzbmRfcGNtX25vbmJsb2NrKGhhbmRsZSwgMCk7CisJc25kX3BjbV9kcmFpbihoYW5kbGUpOworCXNuZF9wY21fbm9uYmxvY2soaGFuZGxlLCBub25ibG9jayk7Cit9CisKKworLyoKKyAqICBsZXQncyBwbGF5IG9yIGNhcHR1cmUgaXQgKGNhcHR1cmVfdHlwZSBzYXlzIFZPQy9XQVZFL3JhdykKKyAqLworCitzdGF0aWMgdm9pZCBwbGF5YmFjayhjaGFyICpuYW1lKQoreworCWludCBvZnM7CisJc2l6ZV90IGR0YTsKKwlzc2l6ZV90IGR0YXdhdmU7CisKKwlwYnJlY19jb3VudCA9IExMT05HX01BWDsKKwlmZGNvdW50ID0gMDsKKwlpZiAoIW5hbWUgfHwgIXN0cmNtcChuYW1lLCAiLSIpKSB7CisJCWZkID0gZmlsZW5vKHN0ZGluKTsKKwkJbmFtZSA9ICJzdGRpbiI7CisJfSBlbHNlIHsKKwkJaW5pdF9zdGRpbigpOworCQlpZiAoKGZkID0gb3BlbjY0KG5hbWUsIE9fUkRPTkxZLCAwKSkgPT0gLTEpIHsKKwkJCXBlcnJvcihuYW1lKTsKKwkJCXByZ19leGl0KEVYSVRfRkFJTFVSRSk7CisJCX0KKwl9CisJLyogcmVhZCB0aGUgZmlsZSBoZWFkZXIgKi8KKwlkdGEgPSBzaXplb2YoQXVIZWFkZXIpOworCWlmICgoc2l6ZV90KXNhZmVfcmVhZChmZCwgYXVkaW9idWYsIGR0YSkgIT0gZHRhKSB7CisJCWVycm9yKF8oInJlYWQgZXJyb3IiKSk7CisJCXByZ19leGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCWlmICh0ZXN0X2F1KGZkLCBhdWRpb2J1ZikgPj0gMCkgeworCQlyaHdwYXJhbXMuZm9ybWF0ID0gaHdwYXJhbXMuZm9ybWF0OworCQlwYnJlY19jb3VudCA9IGNhbGNfY291bnQoKTsKKwkJcGxheWJhY2tfZ28oZmQsIDAsIHBicmVjX2NvdW50LCBGT1JNQVRfQVUsIG5hbWUpOworCQlnb3RvIF9fZW5kOworCX0KKwlkdGEgPSBzaXplb2YoVm9jSGVhZGVyKTsKKwlpZiAoKHNpemVfdClzYWZlX3JlYWQoZmQsIGF1ZGlvYnVmICsgc2l6ZW9mKEF1SGVhZGVyKSwKKwkJIGR0YSAtIHNpemVvZihBdUhlYWRlcikpICE9IGR0YSAtIHNpemVvZihBdUhlYWRlcikpIHsKKwkJZXJyb3IoXygicmVhZCBlcnJvciIpKTsKKwkJcHJnX2V4aXQoRVhJVF9GQUlMVVJFKTs7CisJfQorCWlmICgob2ZzID0gdGVzdF92b2NmaWxlKGF1ZGlvYnVmKSkgPj0gMCkgeworCQlwYnJlY19jb3VudCA9IGNhbGNfY291bnQoKTsKKwkJdm9jX3BsYXkoZmQsIG9mcywgbmFtZSk7CisJCWdvdG8gX19lbmQ7CisJfQorCS8qIHJlYWQgYnl0ZXMgZm9yIFdBVkUtaGVhZGVyICovCisJaWYgKChkdGF3YXZlID0gdGVzdF93YXZlZmlsZShmZCwgYXVkaW9idWYsIGR0YSkpID49IDApIHsKKwkJcGJyZWNfY291bnQgPSBjYWxjX2NvdW50KCk7CisJCXBsYXliYWNrX2dvKGZkLCBkdGF3YXZlLCBwYnJlY19jb3VudCwgRk9STUFUX1dBVkUsIG5hbWUpOworCX0gZWxzZSB7CisJCS8qIHNob3VsZCBiZSByYXcgZGF0YSAqLworCQlpbml0X3Jhd19kYXRhKCk7CisJCXBicmVjX2NvdW50ID0gY2FsY19jb3VudCgpOworCQlwbGF5YmFja19nbyhmZCwgZHRhLCBwYnJlY19jb3VudCwgRk9STUFUX1JBVywgbmFtZSk7CisJfQorICAgICAgX19lbmQ6CisJaWYgKGZkICE9IDApCisJCWNsb3NlKGZkKTsKK30KKworLyoqCisgKiBteXN0cmZ0aW1lCisgKgorICogICBWYXJpYW50IG9mIHN0cmZ0aW1lKDMpIHRoYXQgc3VwcG9ydHMgYWRkaXRpb25hbCBmb3JtYXQKKyAqICAgc3BlY2lmaWVycyBpbiB0aGUgZm9ybWF0IHN0cmluZy4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqICAgcwkgIC0gZGVzdGluYXRpb24gc3RyaW5nCisgKiAgIG1heAktIG1heCBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKyAqICAgdXNlcmZvcm1hdCAtIGZvcm1hdCBzdHJpbmcKKyAqICAgdG0JIC0gdGltZSBpbmZvcm1hdGlvbgorICogICBmaWxlbnVtYmVyIC0gdGhlIG51bWJlciBvZiB0aGUgZmlsZSwgc3RhcnRpbmcgYXQgMQorICoKKyAqIFJldHVybnM6IG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIHRoZSBzdHJpbmcgcworICovCitzaXplX3QgbXlzdHJmdGltZShjaGFyICpzLCBzaXplX3QgbWF4LCBjb25zdCBjaGFyICp1c2VyZm9ybWF0LAorCQkgIGNvbnN0IHN0cnVjdCB0bSAqdG0sIGNvbnN0IGludCBmaWxlbnVtYmVyKQoreworCWNoYXIgZm9ybWF0c3RyaW5nW1BBVEhfTUFYXSA9ICIiOworCWNoYXIgdGVtcHN0cmluZ1tQQVRIX01BWF0gPSAiIjsKKwljaGFyICpmb3JtYXQsICp0ZW1wc3RyOworCWNvbnN0IGNoYXIgKnBvc191c2VyZm9ybWF0OworCisJZm9ybWF0ID0gZm9ybWF0c3RyaW5nOworCisJLyogaWYgbXlzdHJmdGltZSBpcyBjYWxsZWQgd2l0aCB1c2VyZm9ybWF0ID0gTlVMTCB3ZSByZXR1cm4gYSB6ZXJvIGxlbmd0aCBzdHJpbmcgKi8KKwlpZiAodXNlcmZvcm1hdCA9PSBOVUxMKSB7CisJCSpzID0gJ1wwJzsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChwb3NfdXNlcmZvcm1hdCA9IHVzZXJmb3JtYXQ7ICpwb3NfdXNlcmZvcm1hdDsgKytwb3NfdXNlcmZvcm1hdCkgeworCQlpZiAoKnBvc191c2VyZm9ybWF0ID09ICclJykgeworCQkJdGVtcHN0ciA9IHRlbXBzdHJpbmc7CisJCQl0ZW1wc3RyWzBdID0gJ1wwJzsKKwkJCXN3aXRjaCAoKisrcG9zX3VzZXJmb3JtYXQpIHsKKworCQkJCWNhc2UgJ1wwJzogLy8gZW5kIG9mIHN0cmluZworCQkJCQktLXBvc191c2VyZm9ybWF0OworCQkJCQlicmVhazsKKworCQkJCWNhc2UgJ3YnOiAvLyBmaWxlIG51bWJlciAKKwkJCQkJc3ByaW50Zih0ZW1wc3RyLCAiJTAyZCIsIGZpbGVudW1iZXIpOworCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6IC8vIEFsbCBvdGhlciBjb2RlcyB3aWxsIGJlIGhhbmRsZWQgYnkgc3RyZnRpbWUKKwkJCQkJKmZvcm1hdCsrID0gJyUnOworCQkJCQkqZm9ybWF0KysgPSAqcG9zX3VzZXJmb3JtYXQ7CisJCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBJZiBhIGZvcm1hdCBzcGVjaWZpZXIgd2FzIGZvdW5kIGFuZCB1c2VkLCBjb3B5IHRoZSByZXN1bHQuICovCisJCQlpZiAodGVtcHN0clswXSkgeworCQkJCXdoaWxlICgoKmZvcm1hdCA9ICp0ZW1wc3RyKyspICE9ICdcMCcpCisJCQkJCSsrZm9ybWF0OworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJLyogRm9yIGFueSBvdGhlciBjaGFyYWN0ZXIgdGhhbiAlIHdlIHNpbXBseSBjb3B5IHRoZSBjaGFyYWN0ZXIgKi8KKwkJKmZvcm1hdCsrID0gKnBvc191c2VyZm9ybWF0OworCX0KKworCSpmb3JtYXQgPSAnXDAnOworCWZvcm1hdCA9IGZvcm1hdHN0cmluZzsKKwlyZXR1cm4gc3RyZnRpbWUocywgbWF4LCBmb3JtYXQsIHRtKTsKK30KKworc3RhdGljIGludCBuZXdfY2FwdHVyZV9maWxlKGNoYXIgKm5hbWUsIGNoYXIgKm5hbWVidWYsIHNpemVfdCBuYW1lbGVuLAorCQkJICAgIGludCBmaWxlY291bnQpCit7CisJY2hhciAqczsKKwljaGFyIGJ1ZltQQVRIX01BWCsxXTsKKwl0aW1lX3QgdDsKKwlzdHJ1Y3QgdG0gKnRtcDsKKworCWlmICh1c2Vfc3RyZnRpbWUpIHsKKwkJdCA9IHRpbWUoTlVMTCk7CisJCXRtcCA9IGxvY2FsdGltZSgmdCk7CisJCWlmICh0bXAgPT0gTlVMTCkgeworCQkJcGVycm9yKCJsb2NhbHRpbWUiKTsKKwkJCXByZ19leGl0KEVYSVRfRkFJTFVSRSk7CisJCX0KKwkJaWYgKG15c3RyZnRpbWUobmFtZWJ1ZiwgbmFtZWxlbiwgbmFtZSwgdG1wLCBmaWxlY291bnQrMSkgPT0gMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJteXN0cmZ0aW1lIHJldHVybmVkIDAiKTsKKwkJCXByZ19leGl0KEVYSVRfRkFJTFVSRSk7CisJCX0KKwkJcmV0dXJuIGZpbGVjb3VudDsKKwl9CisKKwkvKiBnZXQgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBmaWxlbmFtZSAqLworCXN0cm5jcHkoYnVmLCBuYW1lLCBzaXplb2YoYnVmKSk7CisKKwkvKiBzZXBhcmF0ZSBleHRlbnNpb24gZnJvbSBmaWxlbmFtZSAqLworCXMgPSBidWYgKyBzdHJsZW4oYnVmKTsKKwl3aGlsZSAocyA+IGJ1ZiAmJiAqcyAhPSAnLicgJiYgKnMgIT0gJy8nKQorCQktLXM7CisJaWYgKCpzID09ICcuJykKKwkJKnMrKyA9IDA7CisJZWxzZSBpZiAoKnMgPT0gJy8nKQorCQlzID0gYnVmICsgc3RybGVuKGJ1Zik7CisKKwkvKiB1cG9uIGZpcnN0IGp1bXAgdG8gdGhpcyBpZiBibG9jayByZW5hbWUgdGhlIGZpcnN0IGZpbGUgKi8KKwlpZiAoZmlsZWNvdW50ID09IDEpIHsKKwkJaWYgKCpzKQorCQkJc25wcmludGYobmFtZWJ1ZiwgbmFtZWxlbiwgIiVzLTAxLiVzIiwgYnVmLCBzKTsKKwkJZWxzZQorCQkJc25wcmludGYobmFtZWJ1ZiwgbmFtZWxlbiwgIiVzLTAxIiwgYnVmKTsKKwkJcmVtb3ZlKG5hbWVidWYpOworCQlyZW5hbWUobmFtZSwgbmFtZWJ1Zik7CisJCWZpbGVjb3VudCA9IDI7CisJfQorCisJLyogbmFtZSBvZiB0aGUgY3VycmVudCBmaWxlICovCisJaWYgKCpzKQorCQlzbnByaW50ZihuYW1lYnVmLCBuYW1lbGVuLCAiJXMtJTAyaS4lcyIsIGJ1ZiwgZmlsZWNvdW50LCBzKTsKKwllbHNlCisJCXNucHJpbnRmKG5hbWVidWYsIG5hbWVsZW4sICIlcy0lMDJpIiwgYnVmLCBmaWxlY291bnQpOworCisJcmV0dXJuIGZpbGVjb3VudDsKK30KKworLyoqCisgKiBjcmVhdGVfcGF0aAorICoKKyAqICAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgZmlsZSBwYXRoLCBsaWtlIG1rZGlyIC1wLiAKKyAqCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqICAgcGF0aCAtIHRoZSBwYXRoIHRvIGNyZWF0ZQorICoKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQorICogT24gZmFpbHVyZSwgYSBtZXNzYWdlIGhhcyBiZWVuIHByaW50ZWQgdG8gc3RkZXJyLgorICovCitpbnQgY3JlYXRlX3BhdGgoY29uc3QgY2hhciAqcGF0aCkKK3sKKwljaGFyICpzdGFydDsKKwltb2RlX3QgbW9kZSA9IFNfSVJXWFUgfCBTX0lSR1JQIHwgU19JWEdSUCB8IFNfSVJPVEggfCBTX0lYT1RIOworCisJaWYgKHBhdGhbMF0gPT0gJy8nKQorCQlzdGFydCA9IHN0cmNocihwYXRoICsgMSwgJy8nKTsKKwllbHNlCisJCXN0YXJ0ID0gc3RyY2hyKHBhdGgsICcvJyk7CisKKwl3aGlsZSAoc3RhcnQpIHsKKwkJY2hhciAqYnVmZmVyID0gc3RyZHVwKHBhdGgpOworCQlidWZmZXJbc3RhcnQtcGF0aF0gPSAweDAwOworCisJCWlmIChta2RpcihidWZmZXIsIG1vZGUpID09IC0xICYmIGVycm5vICE9IEVFWElTVCkgeworCQkJZnByaW50ZihzdGRlcnIsICJQcm9ibGVtIGNyZWF0aW5nIGRpcmVjdG9yeSAlcyIsIGJ1ZmZlcik7CisJCQlwZXJyb3IoIiAiKTsKKwkJCWZyZWUoYnVmZmVyKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlmcmVlKGJ1ZmZlcik7CisJCXN0YXJ0ID0gc3RyY2hyKHN0YXJ0ICsgMSwgJy8nKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2FmZV9vcGVuKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGZkOworCisJZmQgPSBvcGVuNjQobmFtZSwgT19XUk9OTFkgfCBPX0NSRUFULCAwNjQ0KTsKKwlpZiAoZmQgPT0gLTEpIHsKKwkJaWYgKGVycm5vICE9IEVOT0VOVCB8fCAhdXNlX3N0cmZ0aW1lKQorCQkJcmV0dXJuIC0xOworCQlpZiAoY3JlYXRlX3BhdGgobmFtZSkgPT0gMCkKKwkJCWZkID0gb3BlbjY0KG5hbWUsIE9fV1JPTkxZIHwgT19DUkVBVCwgMDY0NCk7CisJfQorCXJldHVybiBmZDsKK30KKworc3RhdGljIHZvaWQgY2FwdHVyZShjaGFyICpvcmlnX25hbWUpCit7CisJaW50IHRvc3Rkb3V0PTA7CQkvKiBib29sZWFuIHdoaWNoIGRlc2NyaWJlcyBvdXRwdXQgc3RyZWFtICovCisJaW50IGZpbGVjb3VudD0wOwkvKiBudW1iZXIgb2YgZmlsZXMgd3JpdHRlbiAqLworCWNoYXIgKm5hbWUgPSBvcmlnX25hbWU7CS8qIGN1cnJlbnQgZmlsZW5hbWUgKi8KKwljaGFyIG5hbWVidWZbUEFUSF9NQVgrMV07CisJb2ZmNjRfdCBjb3VudCwgcmVzdDsJCS8qIG51bWJlciBvZiBieXRlcyB0byBjYXB0dXJlICovCisKKwkvKiBnZXQgbnVtYmVyIG9mIGJ5dGVzIHRvIGNhcHR1cmUgKi8KKwljb3VudCA9IGNhbGNfY291bnQoKTsKKwlpZiAoY291bnQgPT0gMCkKKwkJY291bnQgPSBMTE9OR19NQVg7CisJLyogY29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBmaWxlICovCisJbWF4X2ZpbGVfc2l6ZSA9IG1heF9maWxlX3RpbWUgKgorCQlzbmRfcGNtX2Zvcm1hdF9zaXplKGh3cGFyYW1zLmZvcm1hdCwKKwkJCQkgICAgaHdwYXJhbXMucmF0ZSAqIGh3cGFyYW1zLmNoYW5uZWxzKTsKKwkvKiBXQVZFLWZpbGUgc2hvdWxkIGJlIGV2ZW4gKEknbSBub3Qgc3VyZSksIGJ1dCB3YXN0aW5nIG9uZSBieXRlCisJICAgaXNuJ3QgYSBwcm9ibGVtICh0aGlzIGNhbiBvbmx5IGJlIGluIDggYml0IG1vbm8pICovCisJaWYgKGNvdW50IDwgTExPTkdfTUFYKQorCQljb3VudCArPSBjb3VudCAlIDI7CisJZWxzZQorCQljb3VudCAtPSBjb3VudCAlIDI7CisKKwkvKiBkaXNwbGF5IHZlcmJvc2Ugb3V0cHV0IHRvIGNvbnNvbGUgKi8KKwloZWFkZXIoZmlsZV90eXBlLCBuYW1lKTsKKworCS8qIHNldHVwIHNvdW5kIGhhcmR3YXJlICovCisJc2V0X3BhcmFtcygpOworCisJLyogd3JpdGUgdG8gc3Rkb3V0PyAqLworCWlmICghbmFtZSB8fCAhc3RyY21wKG5hbWUsICItIikpIHsKKwkJZmQgPSBmaWxlbm8oc3Rkb3V0KTsKKwkJbmFtZSA9ICJzdGRvdXQiOworCQl0b3N0ZG91dD0xOworCQlpZiAoY291bnQgPiBmbXRfcmVjX3RhYmxlW2ZpbGVfdHlwZV0ubWF4X2ZpbGVzaXplKQorCQkJY291bnQgPSBmbXRfcmVjX3RhYmxlW2ZpbGVfdHlwZV0ubWF4X2ZpbGVzaXplOworCX0KKwlpbml0X3N0ZGluKCk7CisKKwlkbyB7CisJCS8qIG9wZW4gYSBmaWxlIHRvIHdyaXRlICovCisJCWlmKCF0b3N0ZG91dCkgeworCQkJLyogdXBvbiB0aGUgc2Vjb25kIGZpbGUgd2Ugc3RhcnQgdGhlIG51bWJlcmluZyBzY2hlbWUgKi8KKwkJCWlmIChmaWxlY291bnQgfHwgdXNlX3N0cmZ0aW1lKSB7CisJCQkJZmlsZWNvdW50ID0gbmV3X2NhcHR1cmVfZmlsZShvcmlnX25hbWUsIG5hbWVidWYsCisJCQkJCQkJICAgICBzaXplb2YobmFtZWJ1ZiksCisJCQkJCQkJICAgICBmaWxlY291bnQpOworCQkJCW5hbWUgPSBuYW1lYnVmOworCQkJfQorCQkJCisJCQkvKiBvcGVuIGEgbmV3IGZpbGUgKi8KKwkJCXJlbW92ZShuYW1lKTsKKwkJCWZkID0gc2FmZV9vcGVuKG5hbWUpOworCQkJaWYgKGZkIDwgMCkgeworCQkJCXBlcnJvcihuYW1lKTsKKwkJCQlwcmdfZXhpdChFWElUX0ZBSUxVUkUpOworCQkJfQorCQkJZmlsZWNvdW50Kys7CisJCX0KKworCQlyZXN0ID0gY291bnQ7CisJCWlmIChyZXN0ID4gZm10X3JlY190YWJsZVtmaWxlX3R5cGVdLm1heF9maWxlc2l6ZSkKKwkJCXJlc3QgPSBmbXRfcmVjX3RhYmxlW2ZpbGVfdHlwZV0ubWF4X2ZpbGVzaXplOworCQlpZiAobWF4X2ZpbGVfc2l6ZSAmJiAocmVzdCA+IG1heF9maWxlX3NpemUpKSAKKwkJCXJlc3QgPSBtYXhfZmlsZV9zaXplOworCisJCS8qIHNldHVwIHNhbXBsZSBoZWFkZXIgKi8KKwkJaWYgKGZtdF9yZWNfdGFibGVbZmlsZV90eXBlXS5zdGFydCkKKwkJCWZtdF9yZWNfdGFibGVbZmlsZV90eXBlXS5zdGFydChmZCwgcmVzdCk7CisKKwkJLyogY2FwdHVyZSAqLworCQlmZGNvdW50ID0gMDsKKwkJd2hpbGUgKHJlc3QgPiAwICYmIHJlY3ljbGVfY2FwdHVyZV9maWxlID09IDApIHsKKwkJCXNpemVfdCBjID0gKHJlc3QgPD0gKG9mZjY0X3QpY2h1bmtfYnl0ZXMpID8KKwkJCQkoc2l6ZV90KXJlc3QgOiBjaHVua19ieXRlczsKKwkJCXNpemVfdCBmID0gYyAqIDggLyBiaXRzX3Blcl9mcmFtZTsKKwkJCWlmIChwY21fcmVhZChhdWRpb2J1ZiwgZikgIT0gZikKKwkJCQlicmVhazsKKwkJCWlmICh3cml0ZShmZCwgYXVkaW9idWYsIGMpICE9IGMpIHsKKwkJCQlwZXJyb3IobmFtZSk7CisJCQkJcHJnX2V4aXQoRVhJVF9GQUlMVVJFKTsKKwkJCX0KKwkJCWNvdW50IC09IGM7CisJCQlyZXN0IC09IGM7CisJCQlmZGNvdW50ICs9IGM7CisJCX0KKworCQkvKiByZS1lbmFibGUgU0lHVVNSMSBzaWduYWwgKi8KKwkJaWYgKHJlY3ljbGVfY2FwdHVyZV9maWxlKSB7CisJCQlyZWN5Y2xlX2NhcHR1cmVfZmlsZSA9IDA7CisJCQlzaWduYWwoU0lHVVNSMSwgc2lnbmFsX2hhbmRsZXJfcmVjeWNsZSk7CisJCX0KKworCQkvKiBmaW5pc2ggc2FtcGxlIGNvbnRhaW5lciAqLworCQlpZiAoZm10X3JlY190YWJsZVtmaWxlX3R5cGVdLmVuZCAmJiAhdG9zdGRvdXQpIHsKKwkJCWZtdF9yZWNfdGFibGVbZmlsZV90eXBlXS5lbmQoZmQpOworCQkJZmQgPSAtMTsKKwkJfQorCisJCS8qIHJlcGVhdCB0aGUgbG9vcCB3aGVuIGZvcm1hdCBpcyByYXcgd2l0aG91dCB0aW1lbGltaXQgb3IKKwkJICogcmVxdWVzdGVkIGNvdW50cyBvZiBkYXRhIGFyZSByZWNvcmRlZAorCQkgKi8KKwl9IHdoaWxlICgoZmlsZV90eXBlID09IEZPUk1BVF9SQVcgJiYgIXRpbWVsaW1pdCkgfHwgY291bnQgPiAwKTsKK30KKworc3RhdGljIHZvaWQgcGxheWJhY2t2X2dvKGludCogZmRzLCB1bnNpZ25lZCBpbnQgY2hhbm5lbHMsIHNpemVfdCBsb2FkZWQsIG9mZjY0X3QgY291bnQsIGludCBydHlwZSwgY2hhciAqKm5hbWVzKQoreworCWludCByOworCXNpemVfdCB2c2l6ZTsKKworCXVuc2lnbmVkIGludCBjaGFubmVsOworCXVfY2hhciAqYnVmc1tjaGFubmVsc107CisKKwloZWFkZXIocnR5cGUsIG5hbWVzWzBdKTsKKwlzZXRfcGFyYW1zKCk7CisKKwl2c2l6ZSA9IGNodW5rX2J5dGVzIC8gY2hhbm5lbHM7CisKKwkvLyBOb3QgeWV0IGltcGxlbWVudGVkCisJYXNzZXJ0KGxvYWRlZCA9PSAwKTsKKworCWZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjaGFubmVsczsgKytjaGFubmVsKQorCQlidWZzW2NoYW5uZWxdID0gYXVkaW9idWYgKyB2c2l6ZSAqIGNoYW5uZWw7CisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNpemVfdCBjID0gMDsKKwkJc2l6ZV90IGV4cGVjdGVkID0gY291bnQgLyBjaGFubmVsczsKKwkJaWYgKGV4cGVjdGVkID4gdnNpemUpCisJCQlleHBlY3RlZCA9IHZzaXplOworCQlkbyB7CisJCQlyID0gc2FmZV9yZWFkKGZkc1swXSwgYnVmc1swXSwgZXhwZWN0ZWQpOworCQkJaWYgKHIgPCAwKSB7CisJCQkJcGVycm9yKG5hbWVzW2NoYW5uZWxdKTsKKwkJCQlwcmdfZXhpdChFWElUX0ZBSUxVUkUpOworCQkJfQorCQkJZm9yIChjaGFubmVsID0gMTsgY2hhbm5lbCA8IGNoYW5uZWxzOyArK2NoYW5uZWwpIHsKKwkJCQlpZiAoc2FmZV9yZWFkKGZkc1tjaGFubmVsXSwgYnVmc1tjaGFubmVsXSwgcikgIT0gcikgeworCQkJCQlwZXJyb3IobmFtZXNbY2hhbm5lbF0pOworCQkJCQlwcmdfZXhpdChFWElUX0ZBSUxVUkUpOworCQkJCX0KKwkJCX0KKwkJCWlmIChyID09IDApCisJCQkJYnJlYWs7CisJCQljICs9IHI7CisJCX0gd2hpbGUgKGMgPCBleHBlY3RlZCk7CisJCWMgPSBjICogOCAvIGJpdHNfcGVyX3NhbXBsZTsKKwkJciA9IHBjbV93cml0ZXYoYnVmcywgY2hhbm5lbHMsIGMpOworCQlpZiAoKHNpemVfdClyICE9IGMpCisJCQlicmVhazsKKwkJciA9IHIgKiBiaXRzX3Blcl9mcmFtZSAvIDg7CisJCWNvdW50IC09IHI7CisJfQorCXNuZF9wY21fbm9uYmxvY2soaGFuZGxlLCAwKTsKKwlzbmRfcGNtX2RyYWluKGhhbmRsZSk7CisJc25kX3BjbV9ub25ibG9jayhoYW5kbGUsIG5vbmJsb2NrKTsKK30KKworc3RhdGljIHZvaWQgY2FwdHVyZXZfZ28oaW50KiBmZHMsIHVuc2lnbmVkIGludCBjaGFubmVscywgb2ZmNjRfdCBjb3VudCwgaW50IHJ0eXBlLCBjaGFyICoqbmFtZXMpCit7CisJc2l6ZV90IGM7CisJc3NpemVfdCByOworCXVuc2lnbmVkIGludCBjaGFubmVsOworCXNpemVfdCB2c2l6ZTsKKwl1X2NoYXIgKmJ1ZnNbY2hhbm5lbHNdOworCisJaGVhZGVyKHJ0eXBlLCBuYW1lc1swXSk7CisJc2V0X3BhcmFtcygpOworCisJdnNpemUgPSBjaHVua19ieXRlcyAvIGNoYW5uZWxzOworCisJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IGNoYW5uZWxzOyArK2NoYW5uZWwpCisJCWJ1ZnNbY2hhbm5lbF0gPSBhdWRpb2J1ZiArIHZzaXplICogY2hhbm5lbDsKKworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc2l6ZV90IHJ2OworCQljID0gY291bnQ7CisJCWlmIChjID4gY2h1bmtfYnl0ZXMpCisJCQljID0gY2h1bmtfYnl0ZXM7CisJCWMgPSBjICogOCAvIGJpdHNfcGVyX2ZyYW1lOworCQlpZiAoKHNpemVfdCkociA9IHBjbV9yZWFkdihidWZzLCBjaGFubmVscywgYykpICE9IGMpCisJCQlicmVhazsKKwkJcnYgPSByICogYml0c19wZXJfc2FtcGxlIC8gODsKKwkJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IGNoYW5uZWxzOyArK2NoYW5uZWwpIHsKKwkJCWlmICgoc2l6ZV90KXdyaXRlKGZkc1tjaGFubmVsXSwgYnVmc1tjaGFubmVsXSwgcnYpICE9IHJ2KSB7CisJCQkJcGVycm9yKG5hbWVzW2NoYW5uZWxdKTsKKwkJCQlwcmdfZXhpdChFWElUX0ZBSUxVUkUpOworCQkJfQorCQl9CisJCXIgPSByICogYml0c19wZXJfZnJhbWUgLyA4OworCQljb3VudCAtPSByOworCQlmZGNvdW50ICs9IHI7CisJfQorfQorCitzdGF0aWMgdm9pZCBwbGF5YmFja3YoY2hhciAqKm5hbWVzLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50IGNoYW5uZWw7CisJdW5zaWduZWQgaW50IGNoYW5uZWxzID0gcmh3cGFyYW1zLmNoYW5uZWxzOworCWludCBhbGxvY2VkID0gMDsKKwlpbnQgZmRzW2NoYW5uZWxzXTsKKwlmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgY2hhbm5lbHM7ICsrY2hhbm5lbCkKKwkJZmRzW2NoYW5uZWxdID0gLTE7CisKKwlpZiAoY291bnQgPT0gMSAmJiBjaGFubmVscyA+IDEpIHsKKwkJc2l6ZV90IGxlbiA9IHN0cmxlbihuYW1lc1swXSk7CisJCWNoYXIgZm9ybWF0WzEwMjRdOworCQltZW1jcHkoZm9ybWF0LCBuYW1lc1swXSwgbGVuKTsKKwkJc3RyY3B5KGZvcm1hdCArIGxlbiwgIi4lZCIpOworCQlsZW4gKz0gNDsKKwkJbmFtZXMgPSBtYWxsb2Moc2l6ZW9mKCpuYW1lcykgKiBjaGFubmVscyk7CisJCWZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjaGFubmVsczsgKytjaGFubmVsKSB7CisJCQluYW1lc1tjaGFubmVsXSA9IG1hbGxvYyhsZW4pOworCQkJc3ByaW50ZihuYW1lc1tjaGFubmVsXSwgZm9ybWF0LCBjaGFubmVsKTsKKwkJfQorCQlhbGxvY2VkID0gMTsKKwl9IGVsc2UgaWYgKGNvdW50ICE9IGNoYW5uZWxzKSB7CisJCWVycm9yKF8oIllvdSBuZWVkIHRvIHNwZWNpZnkgJWQgZmlsZXMiKSwgY2hhbm5lbHMpOworCQlwcmdfZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKworCWZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjaGFubmVsczsgKytjaGFubmVsKSB7CisJCWZkc1tjaGFubmVsXSA9IG9wZW4obmFtZXNbY2hhbm5lbF0sIE9fUkRPTkxZLCAwKTsKKwkJaWYgKGZkc1tjaGFubmVsXSA8IDApIHsKKwkJCXBlcnJvcihuYW1lc1tjaGFubmVsXSk7CisJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCQlnb3RvIF9fZW5kOworCQl9CisJfQorCS8qIHNob3VsZCBiZSByYXcgZGF0YSAqLworCWluaXRfcmF3X2RhdGEoKTsKKwlwYnJlY19jb3VudCA9IGNhbGNfY291bnQoKTsKKwlwbGF5YmFja3ZfZ28oZmRzLCBjaGFubmVscywgMCwgcGJyZWNfY291bnQsIEZPUk1BVF9SQVcsIG5hbWVzKTsKKworICAgICAgX19lbmQ6CisJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IGNoYW5uZWxzOyArK2NoYW5uZWwpIHsKKwkJaWYgKGZkc1tjaGFubmVsXSA+PSAwKQorCQkJY2xvc2UoZmRzW2NoYW5uZWxdKTsKKwkJaWYgKGFsbG9jZWQpCisJCQlmcmVlKG5hbWVzW2NoYW5uZWxdKTsKKwl9CisJaWYgKGFsbG9jZWQpCisJCWZyZWUobmFtZXMpOworCWlmIChyZXQpCisJCXByZ19leGl0KHJldCk7Cit9CisKK3N0YXRpYyB2b2lkIGNhcHR1cmV2KGNoYXIgKipuYW1lcywgdW5zaWduZWQgaW50IGNvdW50KQoreworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGludCBjaGFubmVsOworCXVuc2lnbmVkIGludCBjaGFubmVscyA9IHJod3BhcmFtcy5jaGFubmVsczsKKwlpbnQgYWxsb2NlZCA9IDA7CisJaW50IGZkc1tjaGFubmVsc107CisJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IGNoYW5uZWxzOyArK2NoYW5uZWwpCisJCWZkc1tjaGFubmVsXSA9IC0xOworCisJaWYgKGNvdW50ID09IDEpIHsKKwkJc2l6ZV90IGxlbiA9IHN0cmxlbihuYW1lc1swXSk7CisJCWNoYXIgZm9ybWF0WzEwMjRdOworCQltZW1jcHkoZm9ybWF0LCBuYW1lc1swXSwgbGVuKTsKKwkJc3RyY3B5KGZvcm1hdCArIGxlbiwgIi4lZCIpOworCQlsZW4gKz0gNDsKKwkJbmFtZXMgPSBtYWxsb2Moc2l6ZW9mKCpuYW1lcykgKiBjaGFubmVscyk7CisJCWZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjaGFubmVsczsgKytjaGFubmVsKSB7CisJCQluYW1lc1tjaGFubmVsXSA9IG1hbGxvYyhsZW4pOworCQkJc3ByaW50ZihuYW1lc1tjaGFubmVsXSwgZm9ybWF0LCBjaGFubmVsKTsKKwkJfQorCQlhbGxvY2VkID0gMTsKKwl9IGVsc2UgaWYgKGNvdW50ICE9IGNoYW5uZWxzKSB7CisJCWVycm9yKF8oIllvdSBuZWVkIHRvIHNwZWNpZnkgJWQgZmlsZXMiKSwgY2hhbm5lbHMpOworCQlwcmdfZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKworCWZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjaGFubmVsczsgKytjaGFubmVsKSB7CisJCWZkc1tjaGFubmVsXSA9IG9wZW4obmFtZXNbY2hhbm5lbF0sIE9fV1JPTkxZICsgT19DUkVBVCwgMDY0NCk7CisJCWlmIChmZHNbY2hhbm5lbF0gPCAwKSB7CisJCQlwZXJyb3IobmFtZXNbY2hhbm5lbF0pOworCQkJcmV0ID0gRVhJVF9GQUlMVVJFOworCQkJZ290byBfX2VuZDsKKwkJfQorCX0KKwkvKiBzaG91bGQgYmUgcmF3IGRhdGEgKi8KKwlpbml0X3Jhd19kYXRhKCk7CisJcGJyZWNfY291bnQgPSBjYWxjX2NvdW50KCk7CisJY2FwdHVyZXZfZ28oZmRzLCBjaGFubmVscywgcGJyZWNfY291bnQsIEZPUk1BVF9SQVcsIG5hbWVzKTsKKworICAgICAgX19lbmQ6CisJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IGNoYW5uZWxzOyArK2NoYW5uZWwpIHsKKwkJaWYgKGZkc1tjaGFubmVsXSA+PSAwKQorCQkJY2xvc2UoZmRzW2NoYW5uZWxdKTsKKwkJaWYgKGFsbG9jZWQpCisJCQlmcmVlKG5hbWVzW2NoYW5uZWxdKTsKKwl9CisJaWYgKGFsbG9jZWQpCisJCWZyZWUobmFtZXMpOworCWlmIChyZXQpCisJCXByZ19leGl0KHJldCk7Cit9CmRpZmYgLS1naXQgYS9hcGxheS9mb3JtYXRzLmggYi9hcGxheS9mb3JtYXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUzMTRmOQotLS0gL2Rldi9udWxsCisrKyBiL2FwbGF5L2Zvcm1hdHMuaApAQCAtMCwwICsxLDEyNyBAQAorI2lmbmRlZiBGT1JNQVRTX0gKKyNkZWZpbmUgRk9STUFUU19ICQkxCisKKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorCisvKiBEZWZpbml0aW9ucyBmb3IgLlZPQyBmaWxlcyAqLworCisjZGVmaW5lIFZPQ19NQUdJQ19TVFJJTkcJIkNyZWF0aXZlIFZvaWNlIEZpbGVceDFBIgorI2RlZmluZSBWT0NfQUNUVUFMX1ZFUlNJT04JMHgwMTBBCisjZGVmaW5lIFZPQ19TQU1QTEVTSVpFCQk4CisKKyNkZWZpbmUgVk9DX01PREVfTU9OTwkJMAorI2RlZmluZSBWT0NfTU9ERV9TVEVSRU8JCTEKKworI2RlZmluZSBWT0NfREFUQUxFTihicCkJCSgodV9sb25nKShicC0+ZGF0YWxlbikgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgCSgodV9sb25nKShicC0+ZGF0YWxlbl9tKSA8PCA4KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAJKCh1X2xvbmcpKGJwLT5kYXRhbGVuX2gpIDw8IDE2KSApCisKK3R5cGVkZWYgc3RydWN0IHZvY19oZWFkZXIgeworCXVfY2hhciBtYWdpY1syMF07CS8qIG11c3QgYmUgTUFHSUNfU1RSSU5HICovCisJdV9zaG9ydCBoZWFkZXJsZW47CS8qIEhlYWRlcmxlbmd0aCwgc2hvdWxkIGJlIDB4MUEgKi8KKwl1X3Nob3J0IHZlcnNpb247CS8qIFZPQy1maWxlIHZlcnNpb24gKi8KKwl1X3Nob3J0IGNvZGVkX3ZlcjsJLyogMHgxMjMzLXZlcnNpb24gKi8KK30gVm9jSGVhZGVyOworCit0eXBlZGVmIHN0cnVjdCB2b2NfYmxvY2t0eXBlIHsKKwl1X2NoYXIgdHlwZTsKKwl1X2NoYXIgZGF0YWxlbjsJCS8qIGxvdy1ieXRlICAgICovCisJdV9jaGFyIGRhdGFsZW5fbTsJLyogbWVkaXVtLWJ5dGUgKi8KKwl1X2NoYXIgZGF0YWxlbl9oOwkvKiBoaWdoLWJ5dGUgICAqLworfSBWb2NCbG9ja1R5cGU7CisKK3R5cGVkZWYgc3RydWN0IHZvY192b2ljZV9kYXRhIHsKKwl1X2NoYXIgdGM7CisJdV9jaGFyIHBhY2s7Cit9IFZvY1ZvaWNlRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3Qgdm9jX2V4dF9ibG9jayB7CisJdV9zaG9ydCB0YzsKKwl1X2NoYXIgcGFjazsKKwl1X2NoYXIgbW9kZTsKK30gVm9jRXh0QmxvY2s7CisKKy8qIERlZmluaXRpb25zIGZvciBNaWNyb3NvZnQgV0FWRSBmb3JtYXQgKi8KKworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgQ09NUE9TRV9JRChhLGIsYyxkKQkoKGEpIHwgKChiKTw8OCkgfCAoKGMpPDwxNikgfCAoKGQpPDwyNCkpCisjZGVmaW5lIExFX1NIT1JUKHYpCQkodikKKyNkZWZpbmUgTEVfSU5UKHYpCQkodikKKyNkZWZpbmUgQkVfU0hPUlQodikJCWJzd2FwXzE2KHYpCisjZGVmaW5lIEJFX0lOVCh2KQkJYnN3YXBfMzIodikKKyNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyNkZWZpbmUgQ09NUE9TRV9JRChhLGIsYyxkKQkoKGQpIHwgKChjKTw8OCkgfCAoKGIpPDwxNikgfCAoKGEpPDwyNCkpCisjZGVmaW5lIExFX1NIT1JUKHYpCQlic3dhcF8xNih2KQorI2RlZmluZSBMRV9JTlQodikJCWJzd2FwXzMyKHYpCisjZGVmaW5lIEJFX1NIT1JUKHYpCQkodikKKyNkZWZpbmUgQkVfSU5UKHYpCQkodikKKyNlbHNlCisjZXJyb3IgIldyb25nIGVuZGlhbiIKKyNlbmRpZgorCisjZGVmaW5lIFdBVl9SSUZGCQlDT01QT1NFX0lEKCdSJywnSScsJ0YnLCdGJykKKyNkZWZpbmUgV0FWX1dBVkUJCUNPTVBPU0VfSUQoJ1cnLCdBJywnVicsJ0UnKQorI2RlZmluZSBXQVZfRk1UCQkJQ09NUE9TRV9JRCgnZicsJ20nLCd0JywnICcpCisjZGVmaW5lIFdBVl9EQVRBCQlDT01QT1NFX0lEKCdkJywnYScsJ3QnLCdhJykKKworLyogV0FWRSBmbXQgYmxvY2sgY29uc3RhbnRzIGZyb20gTWljcm9zb2Z0IG1tcmVnLmggaGVhZGVyICovCisjZGVmaW5lIFdBVl9GTVRfUENNICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBXQVZfRk1UX0lFRUVfRkxPQVQgICAgICAweDAwMDMKKyNkZWZpbmUgV0FWX0ZNVF9ET0xCWV9BQzNfU1BESUYgMHgwMDkyCisjZGVmaW5lIFdBVl9GTVRfRVhURU5TSUJMRSAgICAgIDB4ZmZmZQorCisvKiBVc2VkIHdpdGggV0FWX0ZNVF9FWFRFTlNJQkxFIGZvcm1hdCAqLworI2RlZmluZSBXQVZfR1VJRF9UQUcJCSJceDAwXHgwMFx4MDBceDAwXHgxMFx4MDBceDgwXHgwMFx4MDBceEFBXHgwMFx4MzhceDlCXHg3MSIKKworLyogaXQncyBpbiBjaHVua3MgbGlrZSAudm9jIGFuZCBBTUlHQSBpZmYsIGJ1dCBteSBzb3VyY2Ugc2F5IHRoZXJlCisgICBhcmUgaW4gb25seSBpbiB0aGlzIGNvbWJpbmF0aW9uLCBzbyBJIGNvbWJpbmVkIHRoZW0gaW4gb25lIGhlYWRlcjsKKyAgIGl0IHdvcmtzIG9uIGFsbCBXQVZFLWZpbGUgSSBoYXZlCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1X2ludCBtYWdpYzsJCS8qICdSSUZGJyAqLworCXVfaW50IGxlbmd0aDsJCS8qIGZpbGVsZW4gKi8KKwl1X2ludCB0eXBlOwkJLyogJ1dBVkUnICovCit9IFdhdmVIZWFkZXI7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1X3Nob3J0IGZvcm1hdDsJCS8qIHNlZSBXQVZfRk1UXyogKi8KKwl1X3Nob3J0IGNoYW5uZWxzOworCXVfaW50IHNhbXBsZV9mcTsJLyogZnJlcXVlbmNlIG9mIHNhbXBsZSAqLworCXVfaW50IGJ5dGVfcF9zZWM7CisJdV9zaG9ydCBieXRlX3Bfc3BsOwkvKiBzYW1wbGVzaXplOyAxIG9yIDIgYnl0ZXMgKi8KKwl1X3Nob3J0IGJpdF9wX3NwbDsJLyogOCwgMTIgb3IgMTYgYml0ICovCit9IFdhdmVGbXRCb2R5OworCit0eXBlZGVmIHN0cnVjdCB7CisJV2F2ZUZtdEJvZHkgZm9ybWF0OworCXVfc2hvcnQgZXh0X3NpemU7CisJdV9zaG9ydCBiaXRfcF9zcGw7CisJdV9pbnQgY2hhbm5lbF9tYXNrOworCXVfc2hvcnQgZ3VpZF9mb3JtYXQ7CS8qIFdBVl9GTVRfKiAqLworCXVfY2hhciBndWlkX3RhZ1sxNF07CS8qIFdBVl9HVUlEX1RBRyAqLworfSBXYXZlRm10RXh0ZW5zaWJsZUJvZHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1X2ludCB0eXBlOwkJLyogJ2RhdGEnICovCisJdV9pbnQgbGVuZ3RoOwkJLyogc2FtcGxlY291bnQgKi8KK30gV2F2ZUNodW5rSGVhZGVyOworCisvKiBEZWZpbml0aW9ucyBmb3IgU3BhcmMgLmF1IGhlYWRlciAqLworCisjZGVmaW5lIEFVX01BR0lDCQlDT01QT1NFX0lEKCcuJywncycsJ24nLCdkJykKKworI2RlZmluZSBBVV9GTVRfVUxBVwkJMQorI2RlZmluZSBBVV9GTVRfTElOOAkJMgorI2RlZmluZSBBVV9GTVRfTElOMTYJCTMKKwordHlwZWRlZiBzdHJ1Y3QgYXVfaGVhZGVyIHsKKwl1X2ludCBtYWdpYzsJCS8qICcuc25kJyAqLworCXVfaW50IGhkcl9zaXplOwkJLyogc2l6ZSBvZiBoZWFkZXIgKG1pbiAyNCkgKi8KKwl1X2ludCBkYXRhX3NpemU7CS8qIHNpemUgb2YgZGF0YSAqLworCXVfaW50IGVuY29kaW5nOwkJLyogc2VlIHRvIEFVX0ZNVF9YWFhYICovCisJdV9pbnQgc2FtcGxlX3JhdGU7CS8qIHNhbXBsZSByYXRlICovCisJdV9pbnQgY2hhbm5lbHM7CQkvKiBudW1iZXIgb2YgY2hhbm5lbHMgKHZvaWNlcykgKi8KK30gQXVIZWFkZXI7CisKKyNlbmRpZgkJCQkvKiBGT1JNQVRTICovCmRpZmYgLS1naXQgYS9jb25maWd1cmUuaW4gYi9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIwOGE5NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZ3VyZS5pbgpAQCAtMCwwICsxLDMxNSBAQAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCitBQ19QUkVSRVEoMi41OSkKK0FDX0lOSVQoYXBsYXkvYXBsYXkuYykKK0FDX1BSRUZJWF9ERUZBVUxUKC91c3IpCitBTV9JTklUX0FVVE9NQUtFKGFsc2EtdXRpbHMsIDEuMC4yNSkKKworQU1fR05VX0dFVFRFWFQoW2V4dGVybmFsXSkKK0FNX0dOVV9HRVRURVhUX1ZFUlNJT04oWzAuMTVdKQorCitkbmwgQ2hlY2tzIGZvciBwcm9ncmFtcy4KKworZG5sIHRyeSB0byBndWVzIGNyb3NzLWNvbXBpbGVyIGlmIG5vdCBzZXQKK2lmIHRlc3QgIngkdGFyZ2V0IiAhPSAieCRob3N0IiAtYSAteiAiYGVjaG8gJENDIHwgZ3JlcCAtZSAnLWdjYydgIjsKK3RoZW4KKyAgQUNfTVNHX0NIRUNLSU5HKGZvciBjcm9zcy1jb21waWxlcikKKworICB3aGljaCAke3Byb2dyYW1fcHJlZml4fWdjYyA+L2Rldi9udWxsIDI+JjEgJiYgQ0M9JHtwcm9ncmFtX3ByZWZpeH1nY2MKKyAgd2hpY2ggJHt0YXJnZXRfY3B1fS0ke3RhcmdldF9vc30tZ2NjID4vZGV2L251bGwgMj4mMSBcCisgICYmIENDPSR7dGFyZ2V0X2NwdX0tJHt0YXJnZXQtb3N9LWdjYworICB3aGljaCAke3RhcmdldF9jcHV9LSR7dGFyZ2V0X3ZlbmRvcn0tJHt0YXJnZXRfb3N9LWdjYyA+L2Rldi9udWxsIDI+JjEgXAorICAmJiBDQz0ke3RhcmdldF9jcHV9LSR7dGFyZ2V0X3ZlbmRvcn0tJHt0YXJnZXRfb3N9LWdjYworCisgIEFDX01TR19SRVNVTFQoJENDKQorZmkKKworQUNfUFJPR19DQworZG5sIEFDX1BST0dfQ1hYCitBQ19QUk9HX0lOU1RBTEwKK0FDX1BST0dfTUtESVJfUAorQUNfUFJPR19MTl9TCitBQ19QUk9HX1NFRAorQU1fUEFUSF9BTFNBKDEuMC4yNCkKK0FDX0NIRUNLX0ZVTkMoW3NuZF9jdGxfZWxlbV9hZGRfZW51bWVyYXRlZF0sCisJICAgICAgLCBbQUNfRVJST1IoW05vIHVzZXIgZW51bSBjb250cm9sIHN1cHBvcnQgaW4gYWxzYS1saWJdKV0pCisKK2RubCBDaGVjayBjb21wb25lbnRzCitBQ19DSEVDS19IRUFERVJTKFthbHNhL3BjbS5oXSwgW2hhdmVfcGNtPSJ5ZXMiXSwgW2hhdmVfcGNtPSJubyJdLAorICBbI2luY2x1ZGUgPGFsc2EvYXNvdW5kbGliLmg+XSkKK0FDX0NIRUNLX0hFQURFUlMoW2Fsc2EvbWl4ZXIuaF0sIFtoYXZlX21peGVyPSJ5ZXMiXSwgW2hhdmVfbWl4ZXI9Im5vIl0sCisgIFsjaW5jbHVkZSA8YWxzYS9hc291bmRsaWIuaD5dKQorQUNfQ0hFQ0tfSEVBREVSUyhbYWxzYS9yYXdtaWRpLmhdLCBbaGF2ZV9yYXdtaWRpPSJ5ZXMiXSwgW2hhdmVfcmF3bWlkaT0ibm8iXSwKKyAgWyNpbmNsdWRlIDxhbHNhL2Fzb3VuZGxpYi5oPl0pCitBQ19DSEVDS19IRUFERVJTKFthbHNhL3NlcS5oXSwgW2hhdmVfc2VxPSJ5ZXMiXSwgW2hhdmVfc2VxPSJubyJdLAorICBbI2luY2x1ZGUgPGFsc2EvYXNvdW5kbGliLmg+XSkKK0FDX0NIRUNLX0hFQURFUlMoW3NhbXBsZXJhdGUuaF0sIFtoYXZlX3NhbXBsZXJhdGU9InllcyJdLCBbaGF2ZV9zYW1wbGVyYXRlPSJubyJdLAorICBbI2luY2x1ZGUgPHNhbXBsZXJhdGUuaD5dKQorCitBTV9DT05ESVRJT05BTChIQVZFX1BDTSwgdGVzdCAiJGhhdmVfcGNtIiA9ICJ5ZXMiKQorQU1fQ09ORElUSU9OQUwoSEFWRV9NSVhFUiwgdGVzdCAiJGhhdmVfbWl4ZXIiID0gInllcyIpCitBTV9DT05ESVRJT05BTChIQVZFX1JBV01JREksIHRlc3QgIiRoYXZlX3Jhd21pZGkiID0gInllcyIpCitBTV9DT05ESVRJT05BTChIQVZFX1NFUSwgdGVzdCAiJGhhdmVfc2VxIiA9ICJ5ZXMiKQorQU1fQ09ORElUSU9OQUwoSEFWRV9TQU1QTEVSQVRFLCB0ZXN0ICIkaGF2ZV9zYW1wbGVyYXRlIiA9ICJ5ZXMiKQorCitkbmwgQ2hlY2sgZm9yIGxpYnJ0CitMSUJSVD0iIgorQUNfTVNHX0NIRUNLSU5HKGZvciBsaWJydCkKK0FDX0FSR19XSVRIKGxpYnJ0LAorICBBU19IRUxQX1NUUklORyhbLS13aXRoLWxpYnJ0XSwgW1VzZSBsaWJydCBmb3IgbW9ub3RvbmljIGNsb2NrIChkZWZhdWx0ID0geWVzKV0pLAorICBbIGhhdmVfbGlicnQ9IiR3aXRodmFsIiBdLCBbIGhhdmVfbGlicnQ9InllcyIgXSkKK2lmIHRlc3QgIiRoYXZlX2xpYnJ0IiA9ICJ5ZXMiOyB0aGVuCisgIEFDX0NIRUNLX0xJQihbcnRdLCBbY2xvY2tfZ2V0dGltZV0sIFtIQVZFX0xJQlJUPSJ5ZXMiXSkKKyAgaWYgdGVzdCAiJEhBVkVfTElCUlQiID0gInllcyIgOyB0aGVuCisgICAgTElCUlQ9Ii1scnQiCisgICAgQUNfREVGSU5FKFtIQVZFX0xJQlJUXSwgMSwgW0hhdmUgbGlicnRdKQorICAgIEFDX0RFRklORShbSEFWRV9DTE9DS19HRVRUSU1FXSwgMSwgW0hhdmUgY2xvY2sgZ2V0dGltZV0pCisgIGZpCitlbHNlCisgIEFDX01TR19SRVNVTFQobm8pCitmaQorCitkbmwgRGlzYWJsZSBhbHNhbWl4ZXIKK0NVUlNFU0lOQz0iIgorQ1VSU0VTTElCPSIiCitDVVJTRVNfQ0ZMQUdTPSIiCithbHNhbWl4ZXI9CitpZiB0ZXN0ICIkaGF2ZV9taXhlciIgPSAieWVzIjsgdGhlbgorQUNfQVJHX0VOQUJMRShhbHNhbWl4ZXIsCisgICAgIFsgIC0tZGlzYWJsZS1hbHNhbWl4ZXIgICAgIERpc2FibGUgYWxzYW1peGVyIGNvbXBpbGF0aW9uXSwKKyAgICAgW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgICAgICB5ZXMpIGFsc2FtaXhlcj10cnVlIDs7CisgICAgICAgbm8pICBhbHNhbWl4ZXI9ZmFsc2UgOzsKKyAgICAgICAqKSBBQ19NU0dfRVJST1IoYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtYWxzYW1peGVyKSA7OworICAgICBlc2FjXSxbYWxzYW1peGVyPXRydWVdKQorZmkKK0FNX0NPTkRJVElPTkFMKEFMU0FNSVhFUiwgdGVzdCB4JGFsc2FtaXhlciA9IHh0cnVlKQorCitkbmwgRGlzYWJsZSBhbHNhY29uZgorQUNfQVJHX0VOQUJMRShhbHNhY29uZiwKKyAgICAgWyAgLS1kaXNhYmxlLWFsc2Fjb25mICAgICAgRGlzYWJsZSBhbHNhY29uZiBwYWNrYWdpbmddLAorICAgICBbY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICAgICAgIHllcykgYWxzYWNvbmY9dHJ1ZSA7OworICAgICAgIG5vKSAgYWxzYWNvbmY9ZmFsc2UgOzsKKyAgICAgICAqKSBBQ19NU0dfRVJST1IoYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtYWxzYWNvbmYpIDs7CisgICAgIGVzYWNdLFthbHNhY29uZj10cnVlXSkKK0FNX0NPTkRJVElPTkFMKEFMU0FDT05GLCB0ZXN0IHgkYWxzYWNvbmYgPSB4dHJ1ZSkKKworZG5sIERpc2FibGUgYWxzYWxvb3AKK0FDX0FSR19FTkFCTEUoYWxzYWxvb3AsCisgICAgIFsgIC0tZGlzYWJsZS1hbHNhbG9vcCAgICAgIERpc2FibGUgYWxzYWxvb3AgcGFja2FnaW5nXSwKKyAgICAgW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgICAgICB5ZXMpIGFsc2Fsb29wPXRydWUgOzsKKyAgICAgICBubykgIGFsc2Fsb29wPWZhbHNlIDs7CisgICAgICAgKikgQUNfTVNHX0VSUk9SKGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLWFsc2Fsb29wKSA7OworICAgICBlc2FjXSxbYWxzYWxvb3A9dHJ1ZV0pCitBTV9DT05ESVRJT05BTChBTFNBTE9PUCwgdGVzdCB4JGFsc2Fsb29wID0geHRydWUpCisKK3htbHRvPSIiCitBQ19BUkdfRU5BQkxFKHhtbHRvLAorIEFTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUteG1sdG9dLCBbRGlzYWJsZSBtYW4gcGFnZSBjcmVhdGlvbiB2aWEgeG1sdG9dKSwKKyB4bWx0bz0iJGVuYWJsZXZhbCIsIHhtbHRvPSJ5ZXMiKQoraWYgdGVzdCAiJHhtbHRvIiA9ICJ5ZXMiOyB0aGVuCisgIEFDX0NIRUNLX1BST0coW3htbHRvXSwgW3htbHRvXSwgW3llc10pCitmaQorQU1fQ09ORElUSU9OQUwoVVNFX1hNTFRPLCB0ZXN0IHgiJHhtbHRvIiA9IHh5ZXMpCisKK0FDX0FSR19XSVRIKAorICAgICAgICBbdWRldi1ydWxlcy1kaXJdLAorICAgICAgICBBU19IRUxQX1NUUklORyhbLS13aXRoLXVkZXYtcnVsZXMtZGlyXSxbRGlyZWN0b3J5IHdoZXJlIHRvIGluc3RhbGwgdWRldiBydWxlcyB0byAoZGVmYXVsdHMgdG8gL2xpYi91ZGV2L3J1bGVzLmQpXSksCisgICAgICAgIFt1ZGV2cnVsZXNkaXI9JHdpdGh2YWxdLCBbdWRldnJ1bGVzZGlyPSIvbGliL3VkZXYvcnVsZXMuZCJdKQorQUNfU1VCU1QodWRldnJ1bGVzZGlyKQorCitkbmwgQ2hlY2tzIGZvciBoZWFkZXIgZmlsZXMuCitBQ19IRUFERVJfU1REQworaWYgdGVzdCB4JGFsc2FtaXhlciA9IHh0cnVlOyB0aGVuCisgIEFDX0FSR19XSVRIKGN1cnNlcywKKyAgICBbICAtLXdpdGgtY3Vyc2VzIGxpYm5hbWUgICBTcGVjaWZ5IHRoZSBjdXJzZXMgbGlicmFyeSB0byB1c2UgKGRlZmF1bHQ9YXV0byldLAorICAgIGN1cnNlc2xpYj0iJHdpdGh2YWwiLAorICAgIGN1cnNlc2xpYj0iYXV0byIpCisgIENVUlNFU0xJQkRJUj0iIgorICBOQ1VSU0VTTElCU1VGRklYPSIiCisgIENVUlNFU19OTFM9Im5vIgorICBpZiB0ZXN0ICIkY3Vyc2VzbGliIiA9ICJuY3Vyc2VzdyIgLW8gXCggIiRjdXJzZXNsaWIiID0gImF1dG8iIC1hICIkVVNFX05MUyIgPSAieWVzIiBcKTsgdGhlbgorICAgIEFDX0NIRUNLX1BST0coW25jdXJzZXN3NV9jb25maWddLCBbbmN1cnNlc3c1LWNvbmZpZ10sIFt5ZXNdKQorICAgIGlmIHRlc3QgIiRuY3Vyc2VzdzVfY29uZmlnIiA9ICJ5ZXMiOyB0aGVuCisgICAgICBDVVJTRVNJTkM9IjxuY3Vyc2VzLmg+IgorICAgICAgQ1VSU0VTTElCPWBuY3Vyc2VzdzUtY29uZmlnIC0tbGlic2AKKyAgICAgIENVUlNFU0xJQkRJUj1gbmN1cnNlc3c1LWNvbmZpZyAtLWxpYmRpcmAKKyAgICAgIENVUlNFU19DRkxBR1M9YG5jdXJzZXN3NS1jb25maWcgLS1jZmxhZ3NgCisgICAgICBjdXJzZXNsaWI9Im5jdXJzZXN3IgorICAgIGVsc2UKKyAgICAgIEFDX0NIRUNLX0xJQihuY3Vyc2VzdywgaW5pdHNjciwKKyAgICAgICAgICAgICAgICAgWyBDVVJTRVNJTkM9JzxuY3Vyc2VzLmg+JzsgQ1VSU0VTTElCPSctbG5jdXJzZXN3JzsgY3Vyc2VzbGliPSJuY3Vyc2VzdyJdKQorICAgIGZpCisgICAgaWYgdGVzdCAtbiAiJENVUlNFU0lOQyI7IHRoZW4KKyAgICAgIE5DVVJTRVNMSUJTVUZGSVg9InciCisgICAgICBDVVJTRVNfTkxTPSJ5ZXMiCisgICAgZmkKKyAgZmkKKyAgaWYgdGVzdCAiJGN1cnNlc2xpYiIgPSAibmN1cnNlcyIgLW8gIiRjdXJzZXNsaWIiID0gImF1dG8iOyB0aGVuCisgICAgQUNfQ0hFQ0tfUFJPRyhbbmN1cnNlczVfY29uZmlnXSwgW25jdXJzZXM1LWNvbmZpZ10sIFt5ZXNdKQorICAgIGlmIHRlc3QgIiRuY3Vyc2VzNV9jb25maWciID0gInllcyI7IHRoZW4KKyAgICAgIENVUlNFU0lOQz0iPG5jdXJzZXMuaD4iCisgICAgICBDVVJTRVNMSUI9YG5jdXJzZXM1LWNvbmZpZyAtLWxpYnNgCisgICAgICBDVVJTRVNMSUJESVI9YG5jdXJzZXM1LWNvbmZpZyAtLWxpYmRpcmAKKyAgICAgIENVUlNFU19DRkxBR1M9YG5jdXJzZXM1LWNvbmZpZyAtLWNmbGFnc2AKKyAgICAgIGN1cnNlc2xpYj0ibmN1cnNlcyIKKyAgICBlbHNlCisgICAgICBBQ19DSEVDS19MSUIobmN1cnNlcywgaW5pdHNjciwKKyAgICAgICAgICAgICAgICAgWyBDVVJTRVNJTkM9JzxuY3Vyc2VzLmg+JzsgQ1VSU0VTTElCPSctbG5jdXJzZXMnOyBjdXJzZXNsaWI9Im5jdXJzZXMiXSkKKyAgICBmaQorICBmaQorICBpZiB0ZXN0ICIkY3Vyc2VzbGliIiA9ICJjdXJzZXMiIC1vICIkY3Vyc2VzbGliIiA9ICJhdXRvIjsgdGhlbgorICAgIEFDX0NIRUNLX0xJQihjdXJzZXMsIGluaXRzY3IsCisgICAgICAgICAgICAgICAgIFsgQ1VSU0VTSU5DPSc8Y3Vyc2VzLmg+JzsgQ1VSU0VTTElCPSctbGN1cnNlcyc7IGN1cnNlc2xpYj0iY3Vyc2VzIl0pCisgIGZpCisgIGlmIHRlc3QgLXogIiRDVVJTRVNJTkMiOyB0aGVuCisgICAgIEFDX01TR19FUlJPUih0aGlzIHBhY2thZ2VzIHJlcXVpcmVzIGEgY3Vyc2VzIGxpYnJhcnkpCisgIGZpCisKKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgY3Vyc2VzIGxpYnJhcnldKQorICBBQ19NU0dfUkVTVUxUKFskY3Vyc2VzbGliXSkKKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgY3Vyc2VzIGhlYWRlciBuYW1lXSkKKyAgQUNfTVNHX1JFU1VMVChbJENVUlNFU0lOQ10pCisgIEFDX01TR19DSEVDS0lORyhbZm9yIGN1cnNlcyBjb21waWxlciBmbGFnc10pCisgIEFDX01TR19SRVNVTFQoWyRDVVJTRVNfQ0ZMQUdTXSkKKworICBkbmwgQ1VSU0VTTElCUyBtaWdodCBoYXZlIHRoZSBsaWJyYXJ5IHBhdGggYXQgdGhlIGJlZ2lubmluZy4gIElmIHNvLCB3ZSBjdXQgaXQKKyAgZG5sIG9mZiBzbyB0aGF0IHdlIGNhbiBpbnNlcnQgdGhlIG90aGVyIGN1cnNlcyBsaWJyYXJpZXMgYmVmb3JlIHRoZSBuY3Vyc2VzCisgIGRubCBsaWJyYXJ5IGJ1dCBhZnRlciB0aGUgbGlicmFyeSBwYXRoICh3aGljaCBpcyBsYXRlciBhZ2FpbiBwcmVwZW5kZWQgYmVsb3cpLgorICBpZiB0ZXN0IC1uICIkQ1VSU0VTTElCRElSIjsgdGhlbgorICAgIGlmIHRlc3QgIi1MJENVUlNFU0xJQkRJUiAiID0gIiQoZWNobyAkQ1VSU0VTTElCIHwgY3V0IC1jLSQoKCR7I0NVUlNFU0xJQkRJUn0rMykpICkiOyB0aGVuCisgICAgICBDVVJTRVNMSUI9IiQoZWNobyAkQ1VSU0VTTElCIHwgY3V0IC1jJCgoJHsjQ1VSU0VTTElCRElSfSs0KSktKSIKKyAgICBmaQorICBmaQorCisgIHNhdmVkX0NGTEFHUz0iJENGTEFHUyIKKyAgc2F2ZWRfTERGTEFHUz0iJExERkxBR1MiCisgIHNhdmVkX0xJQlM9IiRMSUJTIgorICBDRkxBR1M9IiRDRkxBR1MgJENVUlNFU19DRkxBR1MiCisgIGlmIHRlc3QgLW4gIiRDVVJTRVNMSUJESVIiOyB0aGVuCisgICAgTERGTEFHUz0iJExERkxBR1MgLUwkQ1VSU0VTTElCRElSIgorICBmaQorICBMSUJTPSIkQ1VSU0VTTElCICRMSUJTIgorCisgIEFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8cGFuZWwuaD5dLCBbc2V0X2VzY2RlbGF5KDEwMCk7XSxbSEFWRV9DVVJTRVNfRVNDREVMQVk9InllcyJdKQorICBpZiB0ZXN0ICIkSEFWRV9DVVJTRVNfRVNDREVMQVkiID0gInllcyI7IHRoZW4KKyAgICBBQ19ERUZJTkUoW0hBVkVfQ1VSU0VTX0VTQ0RFTEFZXSwgMSwgW0hhdmUgY3Vyc2VzIHNldF9lc2NkZWxheV0pCisgIGZpCisKKyAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBjdXJzZXMgTkxTIHN1cHBvcnRdKQorICAgIGRubCBJbiB0aGVvcnksIGEgc2luZ2xlLWJ5dGUgY3Vyc2VzIHdvcmtzIGp1c3QgZmluZSBpbiBJU08gODg1OS0qIGxvY2FsZXMuCisgICAgZG5sIEluIHByYWN0aWNlLCBob3dldmVyLCBldmVyeWJvZHkgdXNlcyBVVEYtOCBub3dhZGF5cywgc28gd2UnZCBiZXR0ZXIKKyAgICBkbmwgY2hlY2sgZm9yIHdpZGUtY2hhcmFjdGVyIHN1cHBvcnQuCisgICAgZG5sIEZvciBuY3Vyc2VzL25jdXJzZXN3LCBDVVJTRVNfTkxTIHdhcyBhbHJlYWR5IHNldCBhYm92ZS4KKyAgICBpZiB0ZXN0ICIkY3Vyc2VzbGliIiA9ICJjdXJzZXMiOyB0aGVuCisgICAgICBBQ19UUllfTElOSyhbCisgICAgICAgICAgI2RlZmluZSBfWE9QRU5fU09VUkNFIDEKKyAgICAgICAgICAjZGVmaW5lIF9YT1BFTl9TT1VSQ0VfRVhURU5ERUQgMQorICAgICAgICAgICNpbmNsdWRlIDxjdXJzZXMuaD4KKyAgICAgICAgXSwgWworICAgICAgICAgIGNjaGFyX3Qgd2M7CisgICAgICAgICAgc2V0Y2NoYXIoJndjLCBMIngiLCBBX05PUk1BTCwgMCwgMCk7CisgICAgICAgIF0sCisgICAgICAgIFtDVVJTRVNfTkxTPSJ5ZXMiXSkKKyAgICBmaQorICAgIEFDX01TR19SRVNVTFQoWyRDVVJTRVNfTkxTXSkKKyAgICBpZiB0ZXN0ICIkQ1VSU0VTX05MUyIgPSAieWVzIjsgdGhlbgorICAgICAgQUNfREVGSU5FKFtFTkFCTEVfTkxTX0lOX0NVUlNFU10sIFsxXSwKKyAgICAgICAgICAgICAgICBbRGVmaW5lIGlmIGN1cnNlcy1iYXNlZCBwcm9ncmFtcyBjYW4gc2hvdyB0cmFuc2xhdGVkIG1lc3NhZ2VzLl0pCisgICAgZmkKKyAgZmkKKworICBBQ19DSEVDS19IRUFERVJTKFtwYW5lbC5oIG1lbnUuaCBmb3JtLmhdLCBbXSwKKyAgICAgICAgICAgICAgICAgICBbQUNfTVNHX0VSUk9SKFtyZXF1aXJlZCBjdXJzZXMgaGVscGVyIGhlYWRlciBub3QgZm91bmRdKV0pCisgIEFDX0NIRUNLX0xJQihbcGFuZWwkTkNVUlNFU0xJQlNVRkZJWF0sIFtuZXdfcGFuZWxdLAorICAgICAgICAgICAgICAgW0NVUlNFU0xJQj0iLWxwYW5lbCROQ1VSU0VTTElCU1VGRklYICRDVVJTRVNMSUIiXSwKKyAgICAgICAgICAgICAgIFtBQ19NU0dfRVJST1IoW3BhbmVsJE5DVVJTRVNMSUJTVUZGSVggbGlicmFyeSBub3QgZm91bmRdKV0pCisgIEFDX0NIRUNLX0xJQihbbWVudSROQ1VSU0VTTElCU1VGRklYXSwgW25ld19tZW51XSwKKyAgICAgICAgICAgICAgIFtDVVJTRVNMSUI9Ii1sbWVudSROQ1VSU0VTTElCU1VGRklYICRDVVJTRVNMSUIiXSwKKyAgICAgICAgICAgICAgIFtBQ19NU0dfRVJST1IoW21lbnUkTkNVUlNFU0xJQlNVRkZJWCBsaWJyYXJ5IG5vdCBmb3VuZF0pXSkKKyAgQUNfQ0hFQ0tfTElCKFtmb3JtJE5DVVJTRVNMSUJTVUZGSVhdLCBbbmV3X2Zvcm1dLAorICAgICAgICAgICAgICAgW0NVUlNFU0xJQj0iLWxmb3JtJE5DVVJTRVNMSUJTVUZGSVggJENVUlNFU0xJQiJdLAorICAgICAgICAgICAgICAgW0FDX01TR19FUlJPUihbZm9ybSROQ1VSU0VTTElCU1VGRklYIGxpYnJhcnkgbm90IGZvdW5kXSldKQorCisgIENGTEFHUz0iJHNhdmVkX0NGTEFHUyIKKyAgTERGTEFHUz0iJHNhdmVkX0xERkxBR1MiCisgIExJQlM9IiRzYXZlZF9MSUJTIgorCisgIGlmIHRlc3QgLW4gIiRDVVJTRVNMSUJESVIiOyB0aGVuCisgICAgQ1VSU0VTTElCPSItTCRDVVJTRVNMSUJESVIgJENVUlNFU0xJQiIKKyAgZmkKKworICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBjdXJzZXMgbGlua2VyIGZsYWdzXSkKKyAgQUNfTVNHX1JFU1VMVChbJENVUlNFU0xJQl0pCitmaQorCitBQ19TVUJTVChDVVJTRVNJTkMpCitBQ19TVUJTVChDVVJTRVNMSUIpCitBQ19TVUJTVChDVVJTRVNfQ0ZMQUdTKQorCit0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisKK2V2YWwgZGlyPSIkZGF0YWRpciIKK2Nhc2UgIiRkaXIiIGluCisvKikgOzsKKyopIGRpcj0iJHByZWZpeC9zaGFyZSIKK2VzYWMKKworc291bmRzZGlyPSIkZGlyL3NvdW5kcy9hbHNhIgorQUNfREVGSU5FX1VOUVVPVEVEKFNPVU5EU0RJUiwgIiRzb3VuZHNkaXIiLCBbZGlyZWN0b3J5IGNvbnRhaW5pbmcgc2FtcGxlIGRhdGFdKQorCitteWRhdGFkaXI9IiRkaXIvYWxzYSIKK0FDX0RFRklORV9VTlFVT1RFRChEQVRBRElSLCAiJG15ZGF0YWRpciIsIFtkaXJlY3RvcnkgY29udGFpbmluZyBhbHNhIGNvbmZpZ3VyYXRpb25dKQorCitBQ19BUkdfV0lUSCh0ZXN0c291bmQsCisgIFsgIC0td2l0aC10ZXN0c291bmQ9ZmlsZSAgICAgICAgZ2l2ZSB0aGUgcGF0aCBvZiB0ZXN0IHNvdW5kIGZpbGUgZm9yIGFsc2Fjb25mXSwKKyAgVEVTVFNPVU5EPSIkd2l0aHZhbCIsCisgIFRFU1RTT1VORD0iJGRpci90ZXN0LndhdiIpCitBQ19TVUJTVChURVNUU09VTkQpCisKK0FNX0NPTkZJR19IRUFERVIoaW5jbHVkZS9hY29uZmlnLmgpCisKK2RubCBDaGVja3MgZm9yIHR5cGVkZWZzLCBzdHJ1Y3R1cmVzLCBhbmQgY29tcGlsZXIgY2hhcmFjdGVyaXN0aWNzLgorQUNfQ19DT05TVAorQUNfQ19JTkxJTkUKK0FDX0hFQURFUl9USU1FCisKK2RubCBDaGVja3MgZm9yIGxpYnJhcnkgZnVuY3Rpb25zLgorQUNfUFJPR19HQ0NfVFJBRElUSU9OQUwKKworZG5sIEVuYWJsZSBsYXJnZWZpbGUgc3VwcG9ydAorQUNfU1lTX0xBUkdFRklMRQorCitTQVZFX1VUSUxfVkVSU0lPTgorCitBQ19TVUJTVChMSUJSVCkKKworZG5sIENoZWNrIGZvciBzeXN0ZW1kCitQS0dfUFJPR19QS0dfQ09ORklHCitBQ19BUkdfV0lUSChbc3lzdGVtZHN5c3RlbXVuaXRkaXJdLAorICAgICAgICBBU19IRUxQX1NUUklORyhbLS13aXRoLXN5c3RlbWRzeXN0ZW11bml0ZGlyPURJUl0sIFtEaXJlY3RvcnkgZm9yIHN5c3RlbWQgc2VydmljZSBmaWxlc10pLAorICAgICAgICBbXSwgW3dpdGhfc3lzdGVtZHN5c3RlbXVuaXRkaXI9JCgkUEtHX0NPTkZJRyAtLXZhcmlhYmxlPXN5c3RlbWRzeXN0ZW11bml0ZGlyIHN5c3RlbWQpXSkKK2lmIHRlc3QgIngkd2l0aF9zeXN0ZW1kc3lzdGVtdW5pdGRpciIgIT0geG5vOyB0aGVuCisgICAgICAgIEFDX1NVQlNUKFtzeXN0ZW1kc3lzdGVtdW5pdGRpcl0sIFskd2l0aF9zeXN0ZW1kc3lzdGVtdW5pdGRpcl0pCitmaQorQU1fQ09ORElUSU9OQUwoSEFWRV9TWVNURU1ELCBbdGVzdCAtbiAiJHdpdGhfc3lzdGVtZHN5c3RlbXVuaXRkaXIiIC1hICJ4JHdpdGhfc3lzdGVtZHN5c3RlbXVuaXRkaXIiICE9IHhubyBdKQorCitBQ19BUkdfV0lUSChbYXNvdW5kLXN0YXRlLWRpcl0sCisgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtYXNvdW5kLXN0YXRlLWRpcj1ESVJdLCBbRGlyZWN0b3J5IHRvIHBsYWNlIGFzb3VuZC5zdGF0ZSBmaWxlIGluXSksCisgICAgICAgIFtBU09VTkRfU1RBVEVfRElSPSIkd2l0aHZhbCJdLAorICAgICAgICBbQVNPVU5EX1NUQVRFX0RJUj0iL3Zhci9saWIvYWxzYSJdKQorQUNfU1VCU1QoQVNPVU5EX1NUQVRFX0RJUikKKworQUNfT1VUUFVUKE1ha2VmaWxlIGFsc2FjdGwvTWFrZWZpbGUgYWxzYWN0bC9pbml0L01ha2VmaWxlIFwKKwkgIGFsc2FtaXhlci9NYWtlZmlsZSBhbWlkaS9NYWtlZmlsZSBhbWl4ZXIvTWFrZWZpbGUgXAorCSAgbTQvTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW4gXAorCSAgYWxzYWNvbmYvYWxzYWNvbmYgYWxzYWNvbmYvTWFrZWZpbGUgXAorCSAgYWxzYWNvbmYvcG8vTWFrZWZpbGUgXAorCSAgYWxzYXVjbS9NYWtlZmlsZSBcCisJICBhcGxheS9NYWtlZmlsZSBpbmNsdWRlL01ha2VmaWxlIGllY3NldC9NYWtlZmlsZSB1dGlscy9NYWtlZmlsZSBcCisJICB1dGlscy9hbHNhLXV0aWxzLnNwZWMgc2VxL01ha2VmaWxlIHNlcS9hY29ubmVjdC9NYWtlZmlsZSBcCisJICBzZXEvYXBsYXltaWRpL01ha2VmaWxlIHNlcS9hc2VxZHVtcC9NYWtlZmlsZSBzZXEvYXNlcW5ldC9NYWtlZmlsZSBcCisJICBzcGVha2VyLXRlc3QvTWFrZWZpbGUgc3BlYWtlci10ZXN0L3NhbXBsZXMvTWFrZWZpbGUgXAorCSAgYWxzYWxvb3AvTWFrZWZpbGUpCmRpZmYgLS1naXQgYS9jdnNjb21waWxlIGIvY3ZzY29tcGlsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NGFkZTRmCi0tLSAvZGV2L251bGwKKysrIGIvY3ZzY29tcGlsZQpAQCAtMCwwICsxLDI1IEBACisjIS9iaW4vYmFzaAorCitpZiB0ZXN0IC1kIC4uL2Fsc2EtbGliL3V0aWxzICYmICEgdGVzdCAtciBgYWNsb2NhbCAtLXByaW50LWFjLWRpcmAvYWxzYS5tNDsgdGhlbgorICBhbHNhX200X2ZsYWdzPSItSSAuLi9hbHNhLWxpYi91dGlscyIKK2ZpCithY2xvY2FsICRhbHNhX200X2ZsYWdzICRBQ0xPQ0FMX0ZMQUdTCisjIHNhdmUgb3JpZ2luYWwgZmlsZXMgdG8gYXZvaWQgc3R1cGlkIG1vZGlmaWNhdGlvbnMgYnkgZ2V0dGV4dGl6ZQorY3AgTWFrZWZpbGUuYW0gTWFrZWZpbGUuYW0ub2sKK2NwIGNvbmZpZ3VyZS5pbiBjb25maWd1cmUuaW4ub2sKK2dldHRleHRpemUgLWMgLWYgLS1uby1jaGFuZ2Vsb2cKK2VjaG8gIkVYVFJBX0RJU1QgPSBnZXR0ZXh0Lm00IiA+IG00L01ha2VmaWxlLmFtCitjcCBNYWtlZmlsZS5hbS5vayBNYWtlZmlsZS5hbQorY3AgY29uZmlndXJlLmluLm9rIGNvbmZpZ3VyZS5pbgorYXV0b2hlYWRlcgorYXV0b21ha2UgLS1mb3JlaWduIC0tY29weSAtLWFkZC1taXNzaW5nCit0b3VjaCBkZXBjb21wCQkjIGZvciBvbGRlciBhdXRvbWFrZQorYXV0b2NvbmYKK2V4cG9ydCBDRkxBR1M9Jy1PMiAtV2FsbCAtcGlwZSAtZycKK2VjaG8gIkNGTEFHUz0kQ0ZMQUdTIgorZWNobyAiLi9jb25maWd1cmUgJEAiCisuL2NvbmZpZ3VyZSAkQCB8fCBleGl0IDEKK3Vuc2V0IENGTEFHUworaWYgWyAteiAiJENWU0NPTVBJTEVfTk9fTUFLRSIgXTsgdGhlbgorICBtYWtlCitmaQpkaWZmIC0tZ2l0IGEvZ2l0Y29tcGlsZSBiL2dpdGNvbXBpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTEzZWY3MgotLS0gL2Rldi9udWxsCisrKyBiL2dpdGNvbXBpbGUKQEAgLTAsMCArMSwyNSBAQAorIyEvYmluL2Jhc2gKKworaWYgdGVzdCAtZCAuLi9hbHNhLWxpYi91dGlscyAmJiAhIHRlc3QgLXIgYGFjbG9jYWwgLS1wcmludC1hYy1kaXJgL2Fsc2EubTQ7IHRoZW4KKyAgYWxzYV9tNF9mbGFncz0iLUkgLi4vYWxzYS1saWIvdXRpbHMiCitmaQorYWNsb2NhbCAkYWxzYV9tNF9mbGFncyAkQUNMT0NBTF9GTEFHUworIyBzYXZlIG9yaWdpbmFsIGZpbGVzIHRvIGF2b2lkIHN0dXBpZCBtb2RpZmljYXRpb25zIGJ5IGdldHRleHRpemUKK2NwIE1ha2VmaWxlLmFtIE1ha2VmaWxlLmFtLm9rCitjcCBjb25maWd1cmUuaW4gY29uZmlndXJlLmluLm9rCitnZXR0ZXh0aXplIC1jIC1mIC0tbm8tY2hhbmdlbG9nCitlY2hvICJFWFRSQV9ESVNUID0gZ2V0dGV4dC5tNCIgPiBtNC9NYWtlZmlsZS5hbQorY3AgTWFrZWZpbGUuYW0ub2sgTWFrZWZpbGUuYW0KK2NwIGNvbmZpZ3VyZS5pbi5vayBjb25maWd1cmUuaW4KK2F1dG9oZWFkZXIKK2F1dG9tYWtlIC0tZm9yZWlnbiAtLWNvcHkgLS1hZGQtbWlzc2luZwordG91Y2ggZGVwY29tcAkJIyBmb3Igb2xkZXIgYXV0b21ha2UKK2F1dG9jb25mCitleHBvcnQgQ0ZMQUdTPSctTzIgLVdhbGwgLXBpcGUgLWcnCitlY2hvICJDRkxBR1M9JENGTEFHUyIKK2VjaG8gIi4vY29uZmlndXJlICRAIgorLi9jb25maWd1cmUgJEAgfHwgZXhpdCAxCit1bnNldCBDRkxBR1MKK2lmIFsgLXogIiRHSVRDT01QSUxFX05PX01BS0UiIF07IHRoZW4KKyAgbWFrZQorZmkKZGlmZiAtLWdpdCBhL2llY3NldC9NYWtlZmlsZS5hbSBiL2llY3NldC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDNhN2YxCi0tLSAvZGV2L251bGwKKysrIGIvaWVjc2V0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsOSBAQAorSU5DTFVERVMgPSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorTERBREQgPSAtbG0KKyMgTERGTEFHUyA9IC1zdGF0aWMKKyMgQ0ZMQUdTICs9IC1nIC1XYWxsCisKK2Jpbl9QUk9HUkFNUyA9IGllY3NldAoraWVjc2V0X1NPVVJDRVMgPSBpZWNzZXQuYyBpZWNiaXRzLmMKK21hbl9NQU5TID0gaWVjc2V0LjEKK0VYVFJBX0RJU1QgPSBpZWNzZXQuMQpkaWZmIC0tZ2l0IGEvaWVjc2V0L2llY2JpdHMuYyBiL2llY3NldC9pZWNiaXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRlYTkzMgotLS0gL2Rldi9udWxsCisrKyBiL2llY3NldC9pZWNiaXRzLmMKQEAgLTAsMCArMSwyNTkgQEAKKy8qCisgICBpZWNkdW1wIC0gZHVtcCBJRUM5NTggc3RhdHVzIGJpdHMgb24gQUxTQQorICAgQ29weXJpZ2h0IChDKSAyMDAzIGJ5IFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgIAorICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgIAorICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhbHNhL2Fzb3VuZGxpYi5oPgorCitzdHJ1Y3QgY2F0ZWdvcnlfc3RyIHsKKwlpbnQgdmFsOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNhdGVnb3J5X3N0ciBjb25fY2F0ZWdvcnlbXSA9IHsKKwl7IElFQzk1OF9BRVMxX0NPTl9HRU5FUkFMLCAiZ2VuZXJhbCIgfSwKKworCXsgSUVDOTU4X0FFUzFfQ09OX0lFQzkwOF9DRCwgIkNEIiB9LAorCXsgSUVDOTU4X0FFUzFfQ09OX05PTl9JRUM5MDhfQ0QsICJub24tSUVDOTA4IENEIiB9LAorCXsgSUVDOTU4X0FFUzFfQ09OX01JTklfRElTQywgIk1pbmktRGlzYyIgfSwKKwl7IElFQzk1OF9BRVMxX0NPTl9EVkQsICJEVkQiIH0sCisKKwl7IElFQzk1OF9BRVMxX0NPTl9QQ01fQ09ERVIsICJQQ00gY29kZXIiIH0sCisJeyBJRUM5NThfQUVTMV9DT05fTUlYRVIsICJkaWdpdGFsIHNpZ25hbCBtaXhlciIgfSwKKwl7IElFQzk1OF9BRVMxX0NPTl9SQVRFX0NPTlZFUlRFUiwgInJhdGUgY29udmVydGVyIiB9LAorCXsgSUVDOTU4X0FFUzFfQ09OX1NBTVBMRVIsICJzYW1wbGVyIiB9LAorCXsgSUVDOTU4X0FFUzFfQ09OX0RTUCwgImRpZ2l0YWwgc291bmQgcHJvY2Vzc29yIiB9LAorCisJeyBJRUM5NThfQUVTMV9DT05fREFULCAiREFUIiB9LAorCXsgSUVDOTU4X0FFUzFfQ09OX1ZDUiwgIlZDUiIgfSwKKwl7IElFQzk1OF9BRVMxX0NPTl9EQ0MsICJEQ0MiIH0sCisJeyBJRUM5NThfQUVTMV9DT05fTUFHTkVUSUNfRElTQywgIm1hZ25ldGljIGRpc2MiIH0sCisKKwl7IElFQzk1OF9BRVMxX0NPTl9EQUJfSkFQQU4sICJkaWdpdGFsIGF1ZGlvIGJyb2FkY2FzdCAoSmFwYW4pIiB9LAorCXsgSUVDOTU4X0FFUzFfQ09OX0RBQl9FVVJPUEUsICJkaWdpdGFsIGF1ZGlvIGJyb2FkY2FzdCAoRXVyb3BlKSIgfSwKKwl7IElFQzk1OF9BRVMxX0NPTl9EQUJfVVNBLCAiZGlnaXRhbCBhdWRpbyBicm9hZGNhc3QgKFVTQSkiIH0sCisJeyBJRUM5NThfQUVTMV9DT05fU09GVFdBUkUsICJzb2Z0d2FyZSBkZWxpdmVyeSIgfSwKKworCXsgSUVDOTU4X0FFUzFfQ09OX1NZTlRIRVNJWkVSLCAic3ludGhlc2l6ZXIiIH0sCisJeyBJRUM5NThfQUVTMV9DT05fTUlDUk9QSE9ORSwgIm1pY3JvcGhvbmUiIH0sCisKKwl7IElFQzk1OF9BRVMxX0NPTl9BREMsICJBREMgd2l0aG91dCBjb3B5cmlnaHQgaW5mb3JtYXRpb24iIH0sCisKKwl7IElFQzk1OF9BRVMxX0NPTl9BRENfQ09QWVJJR0hULCAiQURDIHdpdGggY29weXJpZ2h0IGluZm9ybWF0aW9uIiB9LAorCisJeyBJRUM5NThfQUVTMV9DT05fU09MSURNRU1fRElHSVRBTF9SRUNPUkRFUl9QTEFZRVIsICJmbGFzaCBtZW1vcnkgcmVjb3JkZXIvcGxheWVyIiB9LAorCisJeyBJRUM5NThfQUVTMV9DT05fRVhQRVJJTUVOVEFMLCAiZXhwZXJpbWVudGFsIiB9LAorfTsKKworCisjZGVmaW5lIEFSUkFZX1NJWkUoeCkgKGludCkoc2l6ZW9mKHgpL3NpemVvZih4WzBdKSkKKwordm9pZCBkdW1wX2llYzk1OChzbmRfYWVzX2llYzk1OF90ICppZWMpCit7CisJaW50IGk7CisKKwlpZiAoISAoaWVjLT5zdGF0dXNbMF0gJiBJRUM5NThfQUVTMF9QUk9GRVNTSU9OQUwpKSB7CisJCS8qIGNvbnN1bWVyICovCisJCXByaW50ZigiTW9kZTogY29uc3VtZXJcbiIpOworCQlwcmludGYoIkRhdGE6ICIpOworCQlpZiAoIShpZWMtPnN0YXR1c1swXSAmIElFQzk1OF9BRVMwX05PTkFVRElPKSkgeworCQkJcHJpbnRmKCJhdWRpb1xuIik7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIm5vbi1hdWRpb1xuIik7CisJCX0KKwkJcHJpbnRmKCJSYXRlOiAiKTsKKwkJc3dpdGNoIChpZWMtPnN0YXR1c1szXSAmIElFQzk1OF9BRVMzX0NPTl9GUykgeworCQljYXNlIElFQzk1OF9BRVMzX0NPTl9GU18yMjA1MDoKKwkJCXByaW50ZigiMjIwNTAgSHpcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVDOTU4X0FFUzNfQ09OX0ZTXzI0MDAwOgorCQkJcHJpbnRmKCIyNDAwMCBIelxuIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUM5NThfQUVTM19DT05fRlNfMzIwMDA6CisJCQlwcmludGYoIjMyMDAwIEh6XG4iKTsKKwkJCWJyZWFrOworCQljYXNlIElFQzk1OF9BRVMzX0NPTl9GU180NDEwMDoKKwkJCXByaW50ZigiNDQxMDAgSHpcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVDOTU4X0FFUzNfQ09OX0ZTXzQ4MDAwOgorCQkJcHJpbnRmKCI0ODAwMCBIelxuIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUM5NThfQUVTM19DT05fRlNfODgyMDA6CisJCQlwcmludGYoIjg4MjAwIEh6XG4iKTsKKwkJCWJyZWFrOworCQljYXNlIElFQzk1OF9BRVMzX0NPTl9GU185NjAwMDoKKwkJCXByaW50ZigiOTYwMDAgSHpcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVDOTU4X0FFUzNfQ09OX0ZTXzE3NjQwMDoKKwkJCXByaW50ZigiMTc2NDAwIEh6XG4iKTsKKwkJCWJyZWFrOworCQljYXNlIElFQzk1OF9BRVMzX0NPTl9GU18xOTIwMDA6CisJCQlwcmludGYoIjE5MjAwMCBIelxuIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUM5NThfQUVTM19DT05fRlNfNzY4MDAwOgorCQkJcHJpbnRmKCI3NjgwMDAgSHpcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVDOTU4X0FFUzNfQ09OX0ZTX05PVElEOgorCQkJcHJpbnRmKCJub3QgaW5kaWNhdGVkXG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRmKCJ1bmtub3duXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCXByaW50ZigiQ29weXJpZ2h0OiAiKTsKKwkJaWYgKGllYy0+c3RhdHVzWzBdICYgSUVDOTU4X0FFUzBfQ09OX05PVF9DT1BZUklHSFQpIHsKKwkJCXByaW50ZigicGVybWl0dGVkXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigicHJvdGVjdGVkXG4iKTsKKwkJfQorCQlwcmludGYoIkVtcGhhc2lzOiAiKTsKKwkJaWYgKChpZWMtPnN0YXR1c1swXSAmIElFQzk1OF9BRVMwX0NPTl9FTVBIQVNJUykgIT0gSUVDOTU4X0FFUzBfQ09OX0VNUEhBU0lTXzUwMTUpIHsKKwkJCXByaW50Zigibm9uZVxuIik7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIjUwLzE1dXNcbiIpOworCQl9CisJCXByaW50ZigiQ2F0ZWdvcnk6ICIpOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb25fY2F0ZWdvcnkpOyBpKyspIHsKKwkJCWlmICgoaWVjLT5zdGF0dXNbMV0gJiBJRUM5NThfQUVTMV9DT05fQ0FURUdPUlkpID09IGNvbl9jYXRlZ29yeVtpXS52YWwpIHsKKwkJCQlwcmludGYoIiVzXG4iLCBjb25fY2F0ZWdvcnlbaV0ubmFtZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGkgPj0gQVJSQVlfU0laRShjb25fY2F0ZWdvcnkpKSB7CisJCQlwcmludGYoInVua25vd24gMHgleFxuIiwgaWVjLT5zdGF0dXNbMV0gJiBJRUM5NThfQUVTMV9DT05fQ0FURUdPUlkpOworCQl9CisJCXByaW50ZigiT3JpZ2luYWw6ICIpOworCQlpZiAoaWVjLT5zdGF0dXNbMV0gJiBJRUM5NThfQUVTMV9DT05fT1JJR0lOQUwpIHsKKwkJCXByaW50Zigib3JpZ2luYWxcbiIpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCIxc3QgZ2VuZXJhdGlvblxuIik7CisJCX0KKwkJcHJpbnRmKCJDbG9jazogIik7CisJCXN3aXRjaCAoaWVjLT5zdGF0dXNbM10gJiBJRUM5NThfQUVTM19DT05fQ0xPQ0spIHsKKwkJY2FzZSBJRUM5NThfQUVTM19DT05fQ0xPQ0tfMTAwMFBQTToKKwkJCXByaW50ZigiMTAwMCBwcG1cbiIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVDOTU4X0FFUzNfQ09OX0NMT0NLXzUwUFBNOgorCQkJcHJpbnRmKCI1MCBwcG1cbiIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVDOTU4X0FFUzNfQ09OX0NMT0NLX1ZBUklBQkxFOgorCQkJcHJpbnRmKCJ2YXJpYWJsZSBwaXRjaFxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ZigidW5rbm93blxuIik7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXByaW50ZigiTW9kZTogcHJvZmVzc2lvbmFsXG4iKTsKKwkJcHJpbnRmKCJEYXRhOiAiKTsKKwkJaWYgKCEoaWVjLT5zdGF0dXNbMF0gJiBJRUM5NThfQUVTMF9OT05BVURJTykpIHsKKwkJCXByaW50ZigiYXVkaW9cbiIpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCJub24tYXVkaW9cbiIpOworCQl9CisJCXByaW50ZigiUmF0ZTogIik7CisJCXN3aXRjaCAoaWVjLT5zdGF0dXNbMF0gJiBJRUM5NThfQUVTMF9QUk9fRlMpIHsKKwkJY2FzZSBJRUM5NThfQUVTMF9QUk9fRlNfNDQxMDA6CisJCQlwcmludGYoIjQ0MTAwIEh6XG4iKTsKKwkJCWJyZWFrOworCQljYXNlIElFQzk1OF9BRVMwX1BST19GU180ODAwMDoKKwkJCXByaW50ZigiNDgwMDAgSHpcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVDOTU4X0FFUzBfUFJPX0ZTXzMyMDAwOgorCQkJcHJpbnRmKCIzMjAwMCBIelxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ZigidW5rbm93blxuIik7CisJCQlicmVhazsKKwkJfQorCQlwcmludGYoIlJhdGUgTG9ja2VkOiAiKTsKKwkJaWYgKGllYy0+c3RhdHVzWzBdICYgSUVDOTU4X0FFUzBfUFJPX0ZSRVFfVU5MT0NLRUQpCisJCQlwcmludGYoIm5vXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRmKCJ5ZXNcbiIpOworCQlwcmludGYoIkVtcGhhc2lzOiAiKTsKKwkJc3dpdGNoIChpZWMtPnN0YXR1c1swXSAmIElFQzk1OF9BRVMwX1BST19FTVBIQVNJUykgeworCQljYXNlIElFQzk1OF9BRVMwX1BST19FTVBIQVNJU19DQ0lUVDoKKwkJCXByaW50ZigiQ0NJVFQgSi4xN1xuIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUM5NThfQUVTMF9QUk9fRU1QSEFTSVNfTk9ORToKKwkJCXByaW50Zigibm9uZVxuIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUM5NThfQUVTMF9QUk9fRU1QSEFTSVNfNTAxNToKKwkJCXByaW50ZigiNTAvMTV1c1xuIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUM5NThfQUVTMF9QUk9fRU1QSEFTSVNfTk9USUQ6CisJCWRlZmF1bHQ6CisJCQlwcmludGYoInVua25vd25cbiIpOworCQkJYnJlYWs7CisJCX0KKwkJcHJpbnRmKCJTdGVyZW9waG9uaWM6ICIpOworCQlpZiAoKGllYy0+c3RhdHVzWzFdICYgSUVDOTU4X0FFUzFfUFJPX01PREUpID09IElFQzk1OF9BRVMxX1BST19NT0RFX1NURVJFT1BIT05JQykgeworCQkJcHJpbnRmKCJzdGVyZW9cbiIpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCJub3QgaW5kaWNhdGVkXG4iKTsKKwkJfQorCQlwcmludGYoIlVzZXJiaXRzOiAiKTsKKwkJc3dpdGNoIChpZWMtPnN0YXR1c1sxXSAmIElFQzk1OF9BRVMxX1BST19VU0VSQklUUykgeworCQljYXNlIElFQzk1OF9BRVMxX1BST19VU0VSQklUU18xOTI6CisJCQlwcmludGYoIjE5MmJpdFxuIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUM5NThfQUVTMV9QUk9fVVNFUkJJVFNfVURFRjoKKwkJCXByaW50ZigidXNlci1kZWZpbmVkXG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRmKCJ1bmtvd25cbiIpOworCQkJYnJlYWs7CisJCX0KKwkJcHJpbnRmKCJTYW1wbGUgQml0czogIik7CisJCXN3aXRjaCAoaWVjLT5zdGF0dXNbMl0gJiBJRUM5NThfQUVTMl9QUk9fU0JJVFMpIHsKKwkJY2FzZSBJRUM5NThfQUVTMl9QUk9fU0JJVFNfMjA6CisJCQlwcmludGYoIjIwIGJpdFxuIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUM5NThfQUVTMl9QUk9fU0JJVFNfMjQ6CisJCQlwcmludGYoIjI0IGJpdFxuIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUM5NThfQUVTMl9QUk9fU0JJVFNfVURFRjoKKwkJCXByaW50ZigidXNlciBkZWZpbmVkXG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRmKCJ1bmtub3duXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCXByaW50ZigiV29yZCBMZW5ndGg6ICIpOworCQlzd2l0Y2ggKGllYy0+c3RhdHVzWzJdICYgSUVDOTU4X0FFUzJfUFJPX1dPUkRMRU4pIHsKKwkJY2FzZSBJRUM5NThfQUVTMl9QUk9fV09SRExFTl8yMl8xODoKKwkJCXByaW50ZigiMjIgYml0IG9yIDE4IGJpdFxuIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUM5NThfQUVTMl9QUk9fV09SRExFTl8yM18xOToKKwkJCXByaW50ZigiMjMgYml0IG9yIDE5IGJpdFxuIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUM5NThfQUVTMl9QUk9fV09SRExFTl8yNF8yMDoKKwkJCXByaW50ZigiMjQgYml0IG9yIDIwIGJpdFxuIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUM5NThfQUVTMl9QUk9fV09SRExFTl8yMF8xNjoKKwkJCXByaW50ZigiMjAgYml0IG9yIDE2IGJpdFxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ZigidW5rbm93blxuIik7CisJCQlicmVhazsKKwkJfQorCX0KK30KKwpkaWZmIC0tZ2l0IGEvaWVjc2V0L2llY3NldC4xIGIvaWVjc2V0L2llY3NldC4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYzRhYzAKLS0tIC9kZXYvbnVsbAorKysgYi9pZWNzZXQvaWVjc2V0LjEKQEAgLTAsMCArMSwxMDQgQEAKKy5USCBpZWNzZXQgMSAiMjMgT2N0IDIwMDMiCisuU0ggTkFNRQoraWVjc2V0IFwtIFNldCBvciBkdW1wIElFQzk1OCBzdGF0dXMgYml0cworCisuU0ggU1lOT1BTSVMKK1xmQmllY3NldFxmUCBbXGZJb3B0aW9uc1xmUF0gW1xmSWNtZFxmUCBcZklhcmdcZlAuLi5dCisKKy5TSCBERVNDUklQVElPTgorXGZCaWVjc2V0XGZQIGlzIGEgc21hbGwgdXRpbGl0eSB0byBzZXQgb3IgZHVtcCB0aGUgSUVDOTU4IChvciBzby1jYWxsZWQKKyJTL1BESUYiKSBzdGF0dXMgYml0cyBvZiB0aGUgc3BlY2lmaWVkIHNvdW5kIGNhcmQgdmlhIEFMU0EgY29udHJvbCBBUEkuCisKK1doZW4gXGZCaWVjc2V0XGZQIGlzIHN0YXJ0ZWQgd2l0aG91dCBhcmd1bWVudHMgZXhjZXB0IGZvciBvcHRpb25zLAoraXQgd2lsbCBzaG93IHRoZSBjdXJyZW50IElFQzk1OCBzdGF0dXMgaW4gYSBodW1hbi1yZWFkYWJsZSBmb3JtLgorV2hlbiB0aGUgY29tbWFuZHMgYXJlIGdpdmVuIGluIHRoZSBhcmd1bWVudHMsIHRoZXkgYXJlIHBhcnNlZAorYW5kIHRoZSBJRUM5NTggc3RhdHVzIGJpdHMgYXJlIHVwZGF0ZWQuICBUaGUgcmVzdWx0YW50IHN0YXR1cyBpcworc2hvd24gYXMgd2VsbC4KKworVGhlIGNvbW1hbmRzIGNvbnNpc3Qgb2YgdGhlIGNvbW1hbmQgZGlyZWN0aXZlIGFuZCB0aGUgYXJndW1lbnQuCitBcyB0aGUgYm9vbGVhbiBhcmd1bWVudCwgXGZJeWVzXGZQLCBcZklub1xmUCwgXGZJdHJ1ZVxmUCwgXGZJZmFsc2VcZlAsCitvciBhIGRpZ2l0IG51bWJlciBpcyBhbGxvd2VkLgorCisuU0ggRVhBTVBMRVMKKy5UUAorLkJJIGllY3NldFwgXC1EaHc6MQorRGlzcGxheXMgdGhlIGN1cnJlbnQgSUVDOTU4IHN0YXR1cyBiaXRzIG9uIHRoZSBzZWNvbmQgY2FyZC4KK1RoaXMgaXMgZXF1aXZhbGVudCB3aXRoIFxmSVwtYyAxXGZQLgorLlRQCisuQkkgaWVjc2V0XCBcLXgKK0Rpc3BsYXlzIHRoZSBjdXJyZW50IElFQzk1OCBzdGF0dXMgYml0cyBpbiBhIHN0eWxlIG9mIHRoZSBhcmd1bWVudHMKK2ZvciB0aGUgUENNIHN0cmVhbS4gIFRoZSBvdXRwdXQgc3RyaW5nIGNhbiBiZSBwYXNzZWQgdG8gdGhlIFxmSWllYzk1OFxmUAorKG9yIFxmSXNwZGlmXGZQKSBQQ00gdHlwZSBhcyB0aGUgb3B0aW9uYWwgYXJndW1lbnQuCisuVFAKKy5CSSBpZWNzZXRcIHByb1wgb2ZmXCBhdWRpb1wgb2ZmCitTZXRzIHRoZSBjdXJyZW50IHN0YXR1cyB0byB0aGUgY29uc3VtZXItbW9kZSBhbmQgdHVybnMgb24gdGhlCitub24tYXVkaW8gYml0LiAgVGhlIG1vZGlmaWVkIHN0YXR1cyB3aWxsIGJlIHNob3duLCB0b28uCisKKy5TSCBPUFRJT05TCisuVFAKK1xmSVwtRFxmUCBkZXZpY2UKK1NwZWNpZmllcyB0aGUgZGV2aWNlIG5hbWUgb2YgdGhlIGNvbnRyb2wgdG8gb3BlbgorLlRQCitcZklcLWNcZlAgY2FyZAorU3BlY2lmaWVzIHRoZSBjYXJkIGluZGV4IHRvIG9wZW4uICBFcXVpdmFsZW50IHdpdGggXGZJXC1EaHc6eFxmUC4KKy5UUAorXGZJXC1uXGZQIGluZGV4CitTcGVjaWZpZXMgdGhlIElFQzk1OCBjb250cm9sIGVsZW1lbnQgaW5kZXgsIGluIGNhc2UgeW91IGhhdmUgbXVsdGlwbGUKK0lFQzk1OCBkZXZpY2VzIGFuZCBuZWVkIHRvIGNob29zZSBvbmUgb2YgdGhlbS4KKy5UUAorXGZJXC14XGZQCitEdW1wcyB0aGUgc3RhdHVzIGluIHRoZSBmb3JtIG9mIEFFU3ggYnl0ZXMuCisuVFAKK1xmSVwtaVxmUAorUmVhZHMgdGhlIGNvbW1hbmQgc2VxdWVuY2VzIGZyb20gc3RkaW4uCitFYWNoIGxpbmUgaGFzIHNpbmdsZSBjb21tYW5kLgorCisuU0ggQ09NTUFORFMKKy5UUAorXGZJcHJvZmVzc2lvbmFsXGZQIDxib29sPgorVGhlIHByb2Zlc3Npb25hbCBtb2RlICh0cnVlKSBvciBjb25zdW1lciBtb2RlIChmYWxzZSkuCisKKy5UUAorXGZJYXVkaW9cZlAgPGJvb2w+CitUaGUgYXVkaW8gbW9kZSAodHJ1ZSkgb3Igbm9uLWF1ZGlvIG1vZGUgKGZhbHNlKS4KKworLlRQCitcZklyYXRlXGZQIDxpbnQ+CitUaGUgc2FtcGxlIHJhdGUgaW4gSHouCisKKy5UUAorXGZJZW1waGFzaXNcZlAgPGludD4KK1RoZSBlbXBoYXNpczogMCA9IG5vbmUsIDEgPSA1MC8xNXVzLCAyID0gQ0NJVFQuCisKKy5UUAorXGZJbG9ja1xmUCA8Ym9vbD4KK1JhdGUgbG9jazogbG9ja2VkICh0cnVlKSwgdW5sb2NrZWQgKGZhbHNlKS4KK1RoaXMgY29tbWFuZCBpcyBmb3IgdGhlIHByb2Zlc3Npb25hbCBtb2RlIG9ubHkuCisKKy5UUAorXGZJc2JpdHNcZlAgPGludD4KK1NhbXBsZSBiaXRzOiAgMiA9IDIwYml0LCA0ID0gMjRiaXQsIDYgPSB1bmRlZmluZWQuCitUaGlzIGNvbW1hbmQgaXMgZm9yIHRoZSBwcm9mZXNzaW9uYWwgbW9kZSBvbmx5LgorCisuVFAKK1xmSXdvcmRsZW5ndGhcZlAgPGludD4KK1dvcmRsZW5ndGg6IDAgPSBObywgMiA9IDIyLTE4IGJpdCwgNCA9IDIzLTE5IGJpdCwgNSA9IDI0LTIwIGJpdCwgNiA9IDIwLTE2IGJpdC4KK1RoaXMgY29tbWFuZCBpcyBmb3IgdGhlIHByb2Zlc3Npb25hbCBtb2RlIG9ubHkuCisKKy5UUAorXGZJY2F0ZWdvcnlcZlAgPGludD4KK0NhdGVnb3J5OiB0aGUgdmFsdWUgaXMgZnJvbSAwIHRvIDB4N2YuCitUaGlzIGNvbW1hbmQgaXMgZm9yIHRoZSBjb25zdW1lciBtb2RlIG9ubHkuCisKKy5UUAorXGZJY29weXJpZ2h0XGZQIDxib29sPgorQ29weXJpZ2h0OiBjb3B5cmlnaHRlZCAodHJ1ZSksIG5vbi1jb3B5cmlnaHRlZCAoZmFsc2UpLgorVGhpcyBjb21tYW5kIGlzIGZvciB0aGUgY29uc3VtZXIgbW9kZSBvbmx5LgorCisuVFAKK1xmSW9yaWdpbmFsXGZQIDxib28+CitPcmlnaW5hbCBmbGFnOiBvcmlnaW5hbCAodHJ1ZSksIDFzdCBnZW5lcmF0aW9uIChmYWxzZSkuCitUaGlzIGNvbW1hbmQgaXMgZm9yIHRoZSBjb25zdW1lciBtb2RlIG9ubHkuCisKKy5TSCBBVVRIT1IKK1Rha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KZGlmZiAtLWdpdCBhL2llY3NldC9pZWNzZXQuYyBiL2llY3NldC9pZWNzZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmE5M2U4Ci0tLSAvZGV2L251bGwKKysrIGIvaWVjc2V0L2llY3NldC5jCkBAIC0wLDAgKzEsNDMyIEBACisvKgorICAgaWVjc2V0IC0gY2hhbmdlIElFQzk1OCBzdGF0dXMgYml0cyBvbiBBTFNBCisgICBDb3B5cmlnaHQgKEMpIDIwMDMgYnkgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAgIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICAgCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8YWxzYS9hc291bmRsaWIuaD4KKwordm9pZCBkdW1wX2llYzk1OChzbmRfYWVzX2llYzk1OF90ICppZWMpOworCitzdGF0aWMgaW50IGdldF9ib29sKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpZiAoc3RybmNtcChzdHIsICJ5ZXMiLCAzKSA9PSAwIHx8CisJICAgIHN0cm5jbXAoc3RyLCAiWUVTIiwgMykgPT0gMCB8fAorCSAgICBzdHJuY21wKHN0ciwgIm9uIiwgMikgPT0gMCB8fAorCSAgICBzdHJuY21wKHN0ciwgIk9OIiwgMikgPT0gMCB8fAorCSAgICBzdHJuY21wKHN0ciwgInRydWUiLCA0KSA9PSAwIHx8CisJICAgIHN0cm5jbXAoc3RyLCAiVFJVRSIsIDQpID09IDAgfHwKKwkgICAgKnN0ciA9PSAnMScpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitlbnVtIHsKKwlDTURfQk9PTCwgQ01EX0JPT0xfSU5WLCBDTURfSU5UCit9OworCitlbnVtIHsKKwlJRFhfUFJPLCBJRFhfTk9BVURJTywgSURYX1JBVEUsIElEWF9VTkxPQ0ssIElEWF9TQklUUywgSURYX1dPUkQsIElEWF9FTVAsIElEWF9DQVQsIElEWF9OT0NPUFksIElEWF9PUklHLAorCUlEWF9MQVNUCit9OworCitzdHJ1Y3QgY21kdGJsIHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCBpZHg7CisJaW50IHR5cGU7CisJY29uc3QgY2hhciAqZGVzYzsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY21kdGJsIGNtZHNbXSA9IHsKKwl7ICJwcm8iLCBJRFhfUFJPLCBDTURfQk9PTCwKKwkgICJwcm9mZXNzaW9uYWwgKGNvbW1vbilcblx0b2ZmID0gY29uc3VtZXIgbW9kZSwgb24gPSBwcm9mZXNzaW9uYWwgbW9kZSIgfSwKKwl7ICJhdWQiLCBJRFhfTk9BVURJTywgQ01EX0JPT0xfSU5WLAorCSAgImF1ZGlvIChjb21tb24pXG5cdG9uID0gYXVkaW8gbW9kZSwgb2ZmID0gbm9uLWF1ZGlvIG1vZGUiIH0sCisJeyAicmF0IiwgSURYX1JBVEUsIENNRF9JTlQsCisJICAicmF0ZSAoY29tbW9uKVxuXHRzYW1wbGUgcmF0ZSBpbiBIeiAoMCA9IG5vdCBpbmRpY2F0ZWQpIiB9LAorCXsgImVtcCIsIElEWF9FTVAsIENNRF9JTlQsCisJICAiZW1waGFzaXMgKGNvbW1vbilcblx0MCA9IG5vbmUsIDEgPSA1MC8xNXVzLCAyID0gQ0NJVFQiIH0sCisJeyAibG9jIiwgSURYX1VOTE9DSywgQ01EX0JPT0xfSU5WLAorCSAgImxvY2sgKHByb2YuKVxuXHRvZmYgPSByYXRlIHVubG9ja2VkLCBvbiA9IHJhdGUgbG9ja2VkIiB9LAorCXsgInNiaSIsIElEWF9TQklUUywgQ01EX0lOVCwKKwkgICJzYml0cyAocHJvZi4pXG5cdHNhbXBsZSBiaXRzIDIgPSAyMGJpdCwgNCA9IDI0Yml0LCA2ID0gdW5kZWYiIH0sCisJeyAid29yIiwgSURYX1dPUkQsIENNRF9JTlQsCisJICAid29yZGxlbmd0aCAocHJvZi4pXG5cdDA9bm8sIDI9MjItMThiaXQsIDQ9MjMtMTliaXQsIDU9MjQtMjBiaXQsIDY9MjAtMTZiaXQiIH0sCisJeyAiY2F0IiwgSURYX0NBVCwgQ01EX0lOVCwKKwkgICJjYXRlZ29yeSAoY29uc3VtZXIpXG5cdDAtMHg3ZiIgfSwKKwl7ICJjb3AiLCBJRFhfTk9DT1BZLCBDTURfQk9PTF9JTlYsCisJICAiY29weXJpZ2h0IChjb25zdW1lcilcblx0b2ZmID0gbm9uLWNvcHlyaWdodCwgb24gPSBjb3B5cmlnaHQiIH0sCisJeyAib3JpIiwgSURYX09SSUcsIENNRF9CT09MLAorCSAgIm9yaWdpbmFsIChjb25zdW1lcilcblx0b2ZmID0gMXN0LWdlbiwgb24gPSBvcmlnaW5hbCIgfSwKK307CisKKworc3RhdGljIHZvaWQgZXJyb3IoY29uc3QgY2hhciAqcywgaW50IGVycikKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiAlc1xuIiwgcywgc25kX3N0cmVycm9yKGVycikpOworfQorCisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJaW50IGk7CisKKwlwcmludGYoIlVzYWdlOiBpZWNzZXQgW29wdGlvbnNdIFtjbWQgYXJnLi4uXVxuIik7CisJcHJpbnRmKCJPcHRpb25zOlxuIik7CisJcHJpbnRmKCIgICAgLUQgZGV2aWNlICAgc3BlY2lmaWVzIHRoZSBjb250cm9sIGRldmljZSB0byB1c2VcbiIpOworCXByaW50ZigiICAgIC1jIGNhcmQgICAgIHNwZWNpZmllcyB0aGUgY2FyZCBudW1iZXIgdG8gdXNlIChlcXVpdi4gd2l0aCAtRGh3OiMpXG4iKTsKKwlwcmludGYoIiAgICAtbiBudW1iZXIgICBzcGVjaWZpZXMgdGhlIGNvbnRyb2wgaW5kZXggbnVtYmVyIChkZWZhdWx0ID0gMClcbiIpOworCXByaW50ZigiICAgIC14ICAgICAgICAgIGR1bXAgdGhlIGR1bXAgdGhlIEFFU3ggaGV4IGNvZGUgZm9yIElFQzk1OCBQQ00gcGFyYW1ldGVyc1xuIik7CisJcHJpbnRmKCIgICAgLWkgICAgICAgICAgcmVhZCBjb21tYW5kcyBmcm9tIHN0ZGluXG4iKTsKKwlwcmludGYoIkNvbW1hbmRzOlxuIik7CisJZm9yIChpID0gMDsgaSA8IChpbnQpKHNpemVvZihjbWRzKS9zaXplb2YoY21kc1swXSkpOyBpKyspIHsKKwkJcHJpbnRmKCIgICAgJXNcbiIsIGNtZHNbaV0uZGVzYyk7CisJfQorfQorCisKKy8qCisgKiBwYXJzZSBpZWNzZXQgY29tbWFuZHMKKyAqLworc3RhdGljIHZvaWQgcGFyc2VfY29tbWFuZChpbnQgKnBhcm1zLCBjb25zdCBjaGFyICpjLCBjb25zdCBjaGFyICphcmcpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgKGludCkoc2l6ZW9mKGNtZHMpL3NpemVvZihjbWRzWzBdKSk7IGkrKykgeworCQlpZiAoc3RybmNtcChjLCBjbWRzW2ldLm5hbWUsIHN0cmxlbihjbWRzW2ldLm5hbWUpKSA9PSAwKSB7CisJCQlpbnQgdmFsOworCQkJc3dpdGNoIChjbWRzW2ldLnR5cGUpIHsKKwkJCWNhc2UgQ01EX0JPT0w6CisJCQkJdmFsID0gZ2V0X2Jvb2woYXJnKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ01EX0JPT0xfSU5WOgorCQkJCXZhbCA9ICFnZXRfYm9vbChhcmcpOworCQkJCWJyZWFrOworCQkJY2FzZSBDTURfSU5UOgorCQkJZGVmYXVsdDoKKwkJCQl2YWwgPSAoaW50KXN0cnRvbChhcmcsIE5VTEwsIDApOworCQkJCWJyZWFrOworCQkJfQorCQkJcGFybXNbY21kc1tpXS5pZHhdID0gdmFsOworCQkJcmV0dXJuOworCQl9CisJfQorfQorCitzdGF0aWMgY2hhciAqc2tpcHNwYWNlKGNoYXIgKmxpbmUpCit7CisJY2hhciAqcDsKKwlmb3IgKHAgPSBsaW5lOyAqcCAmJiBpc3NwYWNlKCpwKTsgcCsrKQorCQk7CisJcmV0dXJuIHA7Cit9CisKKy8qCisgKiBwYXJzZSBpZWNzZXQgY29tbWFuZHMgZnJvbSB0aGUgZmlsZQorICovCitzdGF0aWMgdm9pZCBwYXJzZV9maWxlKGludCAqcGFybXMsIEZJTEUgKmZwKQoreworCWNoYXIgbGluZVsxMDI0XSwgKmNtZCwgKmFyZzsKKwl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkgIT0gTlVMTCkgeworCQljbWQgPSBza2lwc3BhY2UobGluZSk7CisJCWlmICgqY21kID09ICcjJyB8fCAhICpjbWQpCisJCQljb250aW51ZTsKKwkJZm9yIChhcmcgPSBjbWQ7ICphcmcgJiYgIWlzc3BhY2UoKmFyZyk7IGFyZysrKQorCQkJOworCQlpZiAoISAqYXJnKQorCQkJY29udGludWU7CisJCSphcmcrKyA9IDA7CisJCWFyZyA9IHNraXBzcGFjZShhcmcpOworCQlpZiAoISAqYXJnKQorCQkJY29udGludWU7CisJCXBhcnNlX2NvbW1hbmQocGFybXMsIGNtZCwgYXJnKTsKKwl9Cit9CisKKy8qIHVwZGF0ZSBpZWM5NTggc3RhdHVzIHZhbHVlcworICogcmV0dXJuIG5vbi16ZXJvIGlmIHRoZSB2YWx1ZXMgYXJlIG1vZGlmaWVkCisgKi8KK3N0YXRpYyBpbnQgdXBkYXRlX2llYzk1OF9zdGF0dXMoc25kX2Flc19pZWM5NThfdCAqaWVjOTU4LCBpbnQgKnBhcm1zKQoreworCWludCBjaGFuZ2VkID0gMDsKKwlpZiAocGFybXNbSURYX1BST10gPj0gMCkgeworCQlpZiAocGFybXNbSURYX1BST10pCisJCQlpZWM5NTgtPnN0YXR1c1swXSB8PSBJRUM5NThfQUVTMF9QUk9GRVNTSU9OQUw7CisJCWVsc2UKKwkJCWllYzk1OC0+c3RhdHVzWzBdICY9IH5JRUM5NThfQUVTMF9QUk9GRVNTSU9OQUw7CisJCWNoYW5nZWQgPSAxOworCX0KKwlpZiAocGFybXNbSURYX05PQVVESU9dID49IDApIHsKKwkJaWYgKHBhcm1zW0lEWF9OT0FVRElPXSkKKwkJCWllYzk1OC0+c3RhdHVzWzBdIHw9IElFQzk1OF9BRVMwX05PTkFVRElPOworCQllbHNlCisJCQlpZWM5NTgtPnN0YXR1c1swXSAmPSB+SUVDOTU4X0FFUzBfTk9OQVVESU87CisJCWNoYW5nZWQgPSAxOworCX0KKwlpZiAocGFybXNbSURYX1JBVEVdID49IDApIHsKKwkJaWYgKGllYzk1OC0+c3RhdHVzWzBdICYgSUVDOTU4X0FFUzBfUFJPRkVTU0lPTkFMKSB7CisJCQlpZWM5NTgtPnN0YXR1c1swXSAmPSB+SUVDOTU4X0FFUzBfUFJPX0ZTOworCQkJc3dpdGNoIChwYXJtc1tJRFhfUkFURV0pIHsKKwkJCWNhc2UgNDQxMDA6CisJCQkJaWVjOTU4LT5zdGF0dXNbMF0gfD0gSUVDOTU4X0FFUzBfUFJPX0ZTXzQ0MTAwOworCQkJCWJyZWFrOworCQkJY2FzZSA0ODAwMDoKKwkJCQlpZWM5NTgtPnN0YXR1c1swXSB8PSBJRUM5NThfQUVTMF9QUk9fRlNfNDgwMDA7CisJCQkJYnJlYWs7CisJCQljYXNlIDMyMDAwOgorCQkJCWllYzk1OC0+c3RhdHVzWzBdIHw9IElFQzk1OF9BRVMwX1BST19GU18zMjAwMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWllYzk1OC0+c3RhdHVzWzNdICY9IH5JRUM5NThfQUVTM19DT05fRlM7CisJCQlzd2l0Y2ggKHBhcm1zW0lEWF9SQVRFXSkgeworCQkJY2FzZSAyMjA1MDoKKwkJCQlpZWM5NTgtPnN0YXR1c1szXSB8PSBJRUM5NThfQUVTM19DT05fRlNfMjIwNTA7CisJCQkJYnJlYWs7CisJCQljYXNlIDI0MDAwOgorCQkJCWllYzk1OC0+c3RhdHVzWzNdIHw9IElFQzk1OF9BRVMzX0NPTl9GU18yNDAwMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzIwMDA6CisJCQkJaWVjOTU4LT5zdGF0dXNbM10gfD0gSUVDOTU4X0FFUzNfQ09OX0ZTXzMyMDAwOworCQkJCWJyZWFrOworCQkJY2FzZSA0NDEwMDoKKwkJCQlpZWM5NTgtPnN0YXR1c1szXSB8PSBJRUM5NThfQUVTM19DT05fRlNfNDQxMDA7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ4MDAwOgorCQkJCWllYzk1OC0+c3RhdHVzWzNdIHw9IElFQzk1OF9BRVMzX0NPTl9GU180ODAwMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgODgyMDA6CisJCQkJaWVjOTU4LT5zdGF0dXNbM10gfD0gSUVDOTU4X0FFUzNfQ09OX0ZTXzg4MjAwOzsKKwkJCQlicmVhazsKKwkJCWNhc2UgOTYwMDA6CisJCQkJaWVjOTU4LT5zdGF0dXNbM10gfD0gSUVDOTU4X0FFUzNfQ09OX0ZTXzk2MDAwOworCQkJCWJyZWFrOworCQkJY2FzZSAxNzY0MDA6CisJCQkJaWVjOTU4LT5zdGF0dXNbM10gfD0gSUVDOTU4X0FFUzNfQ09OX0ZTXzE3NjQwMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTkyMDAwOgorCQkJCWllYzk1OC0+c3RhdHVzWzNdIHw9IElFQzk1OF9BRVMzX0NPTl9GU18xOTIwMDA7CisJCQkJYnJlYWs7CisJCQljYXNlIDc2ODAwMDoKKwkJCQlpZWM5NTgtPnN0YXR1c1szXSB8PSBJRUM5NThfQUVTM19DT05fRlNfNzY4MDAwOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlpZWM5NTgtPnN0YXR1c1szXSB8PSBJRUM5NThfQUVTM19DT05fRlNfTk9USUQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJY2hhbmdlZCA9IDE7CisJfQorCWlmIChwYXJtc1tJRFhfTk9DT1BZXSA+PSAwKSB7CisJCWlmICghIChpZWM5NTgtPnN0YXR1c1swXSAmIElFQzk1OF9BRVMwX1BST0ZFU1NJT05BTCkpIHsKKwkJCWlmIChwYXJtc1tJRFhfTk9DT1BZXSkKKwkJCQlpZWM5NTgtPnN0YXR1c1swXSB8PSBJRUM5NThfQUVTMF9DT05fTk9UX0NPUFlSSUdIVDsKKwkJCWVsc2UKKwkJCQlpZWM5NTgtPnN0YXR1c1swXSAmPSB+SUVDOTU4X0FFUzBfQ09OX05PVF9DT1BZUklHSFQ7CisJCX0KKwkJY2hhbmdlZCA9IDE7CisJfQorCWlmIChwYXJtc1tJRFhfT1JJR10gPj0gMCkgeworCQlpZiAoISAoaWVjOTU4LT5zdGF0dXNbMF0gJiBJRUM5NThfQUVTMF9QUk9GRVNTSU9OQUwpKSB7CisJCQlpZiAocGFybXNbSURYX09SSUddKQorCQkJCWllYzk1OC0+c3RhdHVzWzFdIHw9IElFQzk1OF9BRVMxX0NPTl9PUklHSU5BTDsKKwkJCWVsc2UKKwkJCQlpZWM5NTgtPnN0YXR1c1sxXSAmPSB+SUVDOTU4X0FFUzFfQ09OX09SSUdJTkFMOworCQl9CisJCWNoYW5nZWQgPSAxOworCX0KKwlpZiAocGFybXNbSURYX0VNUF0gPj0gMCkgeworCQlpZiAoaWVjOTU4LT5zdGF0dXNbMF0gJiBJRUM5NThfQUVTMF9QUk9GRVNTSU9OQUwpIHsKKwkJCWllYzk1OC0+c3RhdHVzWzBdICY9IH5JRUM5NThfQUVTMF9QUk9fRU1QSEFTSVM7CisJCQlzd2l0Y2ggKHBhcm1zW0lEWF9FTVBdKSB7CisJCQljYXNlIDA6CisJCQkJaWVjOTU4LT5zdGF0dXNbMF0gfD0gSUVDOTU4X0FFUzBfUFJPX0VNUEhBU0lTX05PTkU7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJaWVjOTU4LT5zdGF0dXNbMF0gfD0gSUVDOTU4X0FFUzBfUFJPX0VNUEhBU0lTXzUwMTU7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJaWVjOTU4LT5zdGF0dXNbMF0gfD0gSUVDOTU4X0FFUzBfUFJPX0VNUEhBU0lTX0NDSVRUOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHBhcm1zW0lEWF9FTVBdKQorCQkJCWllYzk1OC0+c3RhdHVzWzBdIHw9IElFQzk1OF9BRVMwX0NPTl9FTVBIQVNJU181MDE1OworCQkJZWxzZQorCQkJCWllYzk1OC0+c3RhdHVzWzBdICY9IH5JRUM5NThfQUVTMF9DT05fRU1QSEFTSVNfNTAxNTsKKwkJfQorCQljaGFuZ2VkID0gMTsKKwl9CisJaWYgKHBhcm1zW0lEWF9VTkxPQ0tdID49IDApIHsKKwkJaWYgKGllYzk1OC0+c3RhdHVzWzBdICYgSUVDOTU4X0FFUzBfUFJPRkVTU0lPTkFMKSB7CisJCQlpZiAocGFybXNbSURYX1VOTE9DS10pCisJCQkJaWVjOTU4LT5zdGF0dXNbMF0gfD0gSUVDOTU4X0FFUzBfUFJPX0ZSRVFfVU5MT0NLRUQ7CisJCQllbHNlCisJCQkJaWVjOTU4LT5zdGF0dXNbMF0gJj0gfklFQzk1OF9BRVMwX1BST19GUkVRX1VOTE9DS0VEOworCQl9CisJCWNoYW5nZWQgPSAxOworCX0KKwlpZiAocGFybXNbSURYX1NCSVRTXSA+PSAwKSB7CisJCWlmIChpZWM5NTgtPnN0YXR1c1swXSAmIElFQzk1OF9BRVMwX1BST0ZFU1NJT05BTCkgeworCQkJaWVjOTU4LT5zdGF0dXNbMl0gJj0gfklFQzk1OF9BRVMyX1BST19TQklUUzsKKwkJCWllYzk1OC0+c3RhdHVzWzJdIHw9IHBhcm1zW0lEWF9TQklUU10gJiA3OworCQl9CisJCWNoYW5nZWQgPSAxOworCX0KKwlpZiAocGFybXNbSURYX1dPUkRdID49IDApIHsKKwkJaWYgKGllYzk1OC0+c3RhdHVzWzBdICYgSUVDOTU4X0FFUzBfUFJPRkVTU0lPTkFMKSB7CisJCQlpZWM5NTgtPnN0YXR1c1syXSAmPSB+SUVDOTU4X0FFUzJfUFJPX1dPUkRMRU47CisJCQlpZWM5NTgtPnN0YXR1c1syXSB8PSAocGFybXNbSURYX1dPUkRdICYgNykgPDwgMzsKKwkJfQorCQljaGFuZ2VkID0gMTsKKwl9CisJaWYgKHBhcm1zW0lEWF9DQVRdID49IDApIHsKKwkJaWYgKCEgKGllYzk1OC0+c3RhdHVzWzBdICYgSUVDOTU4X0FFUzBfUFJPRkVTU0lPTkFMKSkgeworCQkJaWVjOTU4LT5zdGF0dXNbMV0gJj0gfklFQzk1OF9BRVMxX0NPTl9DQVRFR09SWTsKKwkJCWllYzk1OC0+c3RhdHVzWzFdIHw9IHBhcm1zW0lEWF9DQVRdICYgMHg3ZjsKKwkJfQorCQljaGFuZ2VkID0gMTsKKwl9CisKKwlyZXR1cm4gY2hhbmdlZDsKK30KKwkJCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICpkZXYgPSAiZGVmYXVsdCI7CisJY29uc3QgY2hhciAqc3BkaWZfc3RyID0gU05EX0NUTF9OQU1FX0lFQzk1OCgiIiwgUExBWUJBQ0ssIERFRkFVTFQpOworCWludCBzcGRpZl9pbmRleCA9IC0xOworCXNuZF9jdGxfdCAqY3RsOworCXNuZF9jdGxfZWxlbV9saXN0X3QgKmNsaXN0OworCXNuZF9jdGxfZWxlbV9pZF90ICpjaWQ7CisJc25kX2N0bF9lbGVtX3ZhbHVlX3QgKmN2YWw7CisJc25kX2Flc19pZWM5NThfdCBpZWM5NTg7CisJaW50IGZyb21fc3RkaW4gPSAwOworCWludCBkdW1waGV4ID0gMDsKKwlpbnQgaSwgYywgZXJyOworCXVuc2lnbmVkIGludCBjb250cm9scywgY2lkeDsKKwljaGFyIHRtcG5hbWVbMzJdOworCWludCBwYXJtc1tJRFhfTEFTVF07CisKKwlmb3IgKGkgPSAwOyBpIDwgSURYX0xBU1Q7IGkrKykKKwkJcGFybXNbaV0gPSAtMTsgLyogbm90IHNldCAqLworCisJd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJEOmM6bjp4aGkiKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ0QnOgorCQkJZGV2ID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ2MnOgorCQkJaSA9IGF0b2kob3B0YXJnKTsKKwkJCWlmIChpIDwgMCB8fCBpID49IDMyKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIGNhcmQgaW5kZXggJWRcbiIsIGkpOworCQkJCXJldHVybiAxOworCQkJfQorCQkJc3ByaW50Zih0bXBuYW1lLCAiaHc6JWQiLCBpKTsKKwkJCWRldiA9IHRtcG5hbWU7CisJCQlicmVhazsKKwkJY2FzZSAnbic6CisJCQlzcGRpZl9pbmRleCA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICd4JzoKKwkJCWR1bXBoZXggPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2knOgorCQkJZnJvbV9zdGRpbiA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCWlmICgoZXJyID0gc25kX2N0bF9vcGVuKCZjdGwsIGRldiwgMCkpIDwgMCkgeworCQllcnJvcigic25kX2N0bF9vcGVuIiwgZXJyKTsKKwkJcmV0dXJuIDE7CisJfQorCisJc25kX2N0bF9lbGVtX2xpc3RfYWxsb2NhKCZjbGlzdCk7CisJaWYgKChlcnIgPSBzbmRfY3RsX2VsZW1fbGlzdChjdGwsIGNsaXN0KSkgPCAwKSB7CisJCWVycm9yKCJzbmRfY3RsX2VsZW1fbGlzdCIsIGVycik7CisJCXJldHVybiAxOworCX0KKwlpZiAoKGVyciA9IHNuZF9jdGxfZWxlbV9saXN0X2FsbG9jX3NwYWNlKGNsaXN0LCBzbmRfY3RsX2VsZW1fbGlzdF9nZXRfY291bnQoY2xpc3QpKSkgPCAwKSB7CisJCWVycm9yKCJzbmRfY3RsX2VsZW1fbGlzdF9hbGxvY19zcGFjZSIsIGVycik7CisJCXJldHVybiAxOworCX0KKwlpZiAoKGVyciA9IHNuZF9jdGxfZWxlbV9saXN0KGN0bCwgY2xpc3QpKSA8IDApIHsKKwkJZXJyb3IoInNuZF9jdGxfZWxlbV9saXN0IiwgZXJyKTsKKwkJcmV0dXJuIDE7CisJfQorCisJY29udHJvbHMgPSBzbmRfY3RsX2VsZW1fbGlzdF9nZXRfdXNlZChjbGlzdCk7CisJZm9yIChjaWR4ID0gMDsgY2lkeCA8IGNvbnRyb2xzOyBjaWR4KyspIHsKKwkJaWYgKCFzdHJjbXAoc25kX2N0bF9lbGVtX2xpc3RfZ2V0X25hbWUoY2xpc3QsIGNpZHgpLCBzcGRpZl9zdHIpKQorCQkJaWYgKHNwZGlmX2luZGV4IDwgMCB8fAorCQkJICAgIHNuZF9jdGxfZWxlbV9saXN0X2dldF9pbmRleChjbGlzdCwgY2lkeCkgPT0gc3BkaWZfaW5kZXgpCisJCQkJYnJlYWs7CisJfQorCWlmIChjaWR4ID49IGNvbnRyb2xzKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY29udHJvbCBcIiVzXCIgKGluZGV4ICVkKSBub3QgZm91bmRcbiIsCisJCQlzcGRpZl9zdHIsIHNwZGlmX2luZGV4KTsKKwkJcmV0dXJuIDE7CisJfQorCisJc25kX2N0bF9lbGVtX2lkX2FsbG9jYSgmY2lkKTsKKwlzbmRfY3RsX2VsZW1fbGlzdF9nZXRfaWQoY2xpc3QsIGNpZHgsIGNpZCk7CisJc25kX2N0bF9lbGVtX3ZhbHVlX2FsbG9jYSgmY3ZhbCk7CisJc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9pZChjdmFsLCBjaWQpOworCWlmICgoZXJyID0gc25kX2N0bF9lbGVtX3JlYWQoY3RsLCBjdmFsKSkgPCAwKSB7CisJCWVycm9yKCJzbmRfY3RsX2VsZW1fcmVhZCIsIGVycik7CisJCXJldHVybiAxOworCX0KKworCXNuZF9jdGxfZWxlbV92YWx1ZV9nZXRfaWVjOTU4KGN2YWwsICZpZWM5NTgpOworCisJLyogcGFyc2UgZnJvbSBzdGRpbiAqLworCWlmIChmcm9tX3N0ZGluKQorCQlwYXJzZV9maWxlKHBhcm1zLCBzdGRpbik7CisKKwkvKiBwYXJzZSBjb21tYW5kcyAqLworCWZvciAoYyA9IG9wdGluZDsgYyA8IGFyZ2MgLSAxOyBjICs9IDIpCisJCXBhcnNlX2NvbW1hbmQocGFybXMsIGFyZ3ZbY10sIGFyZ3ZbYyArIDFdKTsKKworCWlmICh1cGRhdGVfaWVjOTU4X3N0YXR1cygmaWVjOTU4LCBwYXJtcykpIHsKKwkJLyogc3RvcmUgdGhlIHZhbHVlcyAqLworCQlzbmRfY3RsX2VsZW1fdmFsdWVfc2V0X2llYzk1OChjdmFsLCAmaWVjOTU4KTsKKwkJaWYgKChlcnIgPSBzbmRfY3RsX2VsZW1fd3JpdGUoY3RsLCBjdmFsKSkgPCAwKSB7CisJCQllcnJvcigic25kX2N0bF9lbGVtX3dyaXRlIiwgZXJyKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmICgoZXJyID0gc25kX2N0bF9lbGVtX3JlYWQoY3RsLCBjdmFsKSkgPCAwKSB7CisJCQllcnJvcigic25kX2N0bF9lbGVtX3dyaXRlIiwgZXJyKTsKKwkJCXJldHVybiAxOworCQl9CisJCXNuZF9jdGxfZWxlbV92YWx1ZV9nZXRfaWVjOTU4KGN2YWwsICZpZWM5NTgpOworCX0KKworCWlmIChkdW1waGV4KQorCQlwcmludGYoIkFFUzA9MHglMDJ4LEFFUzE9MHglMDJ4LEFFUzI9MHglMDJ4LEFFUzM9MHglMDJ4XG4iLAorCQkgICAgICAgaWVjOTU4LnN0YXR1c1swXSwgaWVjOTU4LnN0YXR1c1sxXSwgaWVjOTU4LnN0YXR1c1syXSwgaWVjOTU4LnN0YXR1c1szXSk7CisJZWxzZQorCQlkdW1wX2llYzk1OCgmaWVjOTU4KTsKKworCXNuZF9jdGxfY2xvc2UoY3RsKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2luY2x1ZGUvTWFrZWZpbGUuYW0gYi9pbmNsdWRlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMzk2OGQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjUgQEAKK25vaW5zdF9IRUFERVJTPXZlcnNpb24uaCBnZXR0ZXh0LmggZ2V0dGV4dF9jdXJzZXMuaAorCit2ZXJzaW9uLmg6IHN0YW1wLXZoCisJQDoKKworc3RhbXAtdmg6ICQodG9wX2J1aWxkZGlyKS9jb25maWd1cmUuaW4KKwlAZWNobyAiLyoiID4gdmVyLnRtcAorCUBlY2hvICIgKiAgdmVyc2lvbi5oIiA+PiB2ZXIudG1wCisJQGVjaG8gIiAqLyIgPj4gdmVyLnRtcAorCUBlY2hvICIiID4+IHZlci50bXAKKwlAZWNobyAiI2RlZmluZSBTTkRfVVRJTF9NQUpPUgkJJChTTkRfVVRJTF9NQUpPUikiID4+IHZlci50bXAKKwlAZWNobyAiI2RlZmluZSBTTkRfVVRJTF9NSU5PUgkJJChTTkRfVVRJTF9NSU5PUikiID4+IHZlci50bXAKKwlAZWNobyAiI2RlZmluZSBTTkRfVVRJTF9TVUJNSU5PUgkkKFNORF9VVElMX1NVQk1JTk9SKSIgPj4gdmVyLnRtcAorCUBlY2hvICIjZGVmaW5lIFNORF9VVElMX1ZFUlNJT04JCSgoU05EX1VUSUxfTUFKT1I8PDE2KXxcXCIgPj4gdmVyLnRtcAorCUBlY2hvICIJCQkJIChTTkRfVVRJTF9NSU5PUjw8OCl8XFwiID4+IHZlci50bXAKKwlAZWNobyAiCQkJCSAgU05EX1VUSUxfU1VCTUlOT1IpIiA+PiB2ZXIudG1wCisJQGVjaG8gIiNkZWZpbmUgU05EX1VUSUxfVkVSU0lPTl9TVFIJXCIkKFNORF9VVElMX1ZFUlNJT04pXCIiID4+IHZlci50bXAKKwlAZWNobyA+PiB2ZXIudG1wCisJQGNtcCAtcyB2ZXJzaW9uLmggdmVyLnRtcCBcCisgICAgICAgICAgfHwgKGVjaG8gIlVwZGF0aW5nIHZlcnNpb24uaCI7IFwKKyAgICAgICAgICAgICAgY3AgdmVyLnRtcCB2ZXJzaW9uLmg7IFwKKyAgICAgICAgICAgICAgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC12aCkKKwktQHJtIC1mIHZlci50bXAKKworSU5DTFVERVM9LUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ2V0dGV4dC5oIGIvaW5jbHVkZS9nZXR0ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhhMTQ2NwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZ2V0dGV4dC5oCkBAIC0wLDAgKzEsMjIgQEAKKyNpZm5kZWYgX19NWV9HRVRURVhUX0gKKyNkZWZpbmUgX19NWV9HRVRURVhUX0gKKworI2lmZGVmIFVTRVNfQ1VSU0VTCisjZGVmaW5lIEVOQUJMRV9OTFNfVEVTVCBFTkFCTEVfTkxTX0lOX0NVUlNFUworI2Vsc2UKKyNkZWZpbmUgRU5BQkxFX05MU19URVNUIEVOQUJMRV9OTFMKKyNlbmRpZgorCisjaWYgRU5BQkxFX05MU19URVNUCisjIGluY2x1ZGUgPGxpYmludGwuaD4KKyNlbHNlCisjIGRlZmluZSBnZXR0ZXh0KG1zZ2lkKSAobXNnaWQpCisjIGRlZmluZSB0ZXh0ZG9tYWluKGRvbWFpbikKKyMgZGVmaW5lIGJpbmR0ZXh0ZG9tYWluKGRvbWFpbiwgZGlyKQorI2VuZGlmCisKKyNkZWZpbmUgXyhtc2dpZCkgZ2V0dGV4dCAobXNnaWQpCisjZGVmaW5lIGdldHRleHRfbm9vcChtc2dpZCkgbXNnaWQKKyNkZWZpbmUgTl8obXNnaWQpIGdldHRleHRfbm9vcCAobXNnaWQpCisKKyNlbmRpZiAvKiBfX01ZX0dFVFRFWFRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9nZXR0ZXh0X2N1cnNlcy5oIGIvaW5jbHVkZS9nZXR0ZXh0X2N1cnNlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYzQwNDEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2dldHRleHRfY3Vyc2VzLmgKQEAgLTAsMCArMSwyIEBACisjZGVmaW5lIFVTRVNfQ1VSU0VTCisjaW5jbHVkZSAiZ2V0dGV4dC5oIgpkaWZmIC0tZ2l0IGEvbGliL3VkZXYvcnVsZXMuZC85MC1hbHNhLXJlc3RvcmUucnVsZXMgYi9saWIvdWRldi9ydWxlcy5kLzkwLWFsc2EtcmVzdG9yZS5ydWxlcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFlZTI5OS4uMDAwMDAwMAotLS0gYS9saWIvdWRldi9ydWxlcy5kLzkwLWFsc2EtcmVzdG9yZS5ydWxlcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotQUNUSU9OPT0iYWRkIiwgU1VCU1lTVEVNPT0ic291bmQiLCBLRVJORUw9PSJjb250cm9sQyoiLCBLRVJORUxTPT0iY2FyZCoiLCBcCi0gICAgICAgIFJVTis9Ii91c3Ivc2Jpbi9hbHNhY3RsIHJlc3RvcmUgJGF0dHJ7bnVtYmVyfSIKZGlmZiAtLWdpdCBhL200L01ha2VmaWxlLmFtIGIvbTQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5OGIyMQotLS0gL2Rldi9udWxsCisrKyBiL200L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEgQEAKK0VYVFJBX0RJU1QgPSBnZXR0ZXh0Lm00CmRpZmYgLS1naXQgYS9wby9MSU5HVUFTIGIvcG8vTElOR1VBUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDI3Mzg2Ci0tLSAvZGV2L251bGwKKysrIGIvcG8vTElOR1VBUwpAQCAtMCwwICsxIEBACitkZSBmciBqYQpkaWZmIC0tZ2l0IGEvcG8vTWFrZXZhcnMgYi9wby9NYWtldmFycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzlkOGFjCi0tLSAvZGV2L251bGwKKysrIGIvcG8vTWFrZXZhcnMKQEAgLTAsMCArMSw0MSBAQAorIyBNYWtlZmlsZSB2YXJpYWJsZXMgZm9yIFBPIGRpcmVjdG9yeSBpbiBhbnkgcGFja2FnZSB1c2luZyBHTlUgZ2V0dGV4dC4KKworIyBVc3VhbGx5IHRoZSBtZXNzYWdlIGRvbWFpbiBpcyB0aGUgc2FtZSBhcyB0aGUgcGFja2FnZSBuYW1lLgorRE9NQUlOID0gJChQQUNLQUdFKQorCisjIFRoZXNlIHR3byB2YXJpYWJsZXMgZGVwZW5kIG9uIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGRpcmVjdG9yeS4KK3N1YmRpciA9IHBvCit0b3BfYnVpbGRkaXIgPSAuLgorCisjIFRoZXNlIG9wdGlvbnMgZ2V0IHBhc3NlZCB0byB4Z2V0dGV4dC4KK1hHRVRURVhUX09QVElPTlMgPSAtLWtleXdvcmQ9XyAtLWtleXdvcmQ9Tl8KKworIyBUaGlzIGlzIHRoZSBjb3B5cmlnaHQgaG9sZGVyIHRoYXQgZ2V0cyBpbnNlcnRlZCBpbnRvIHRoZSBoZWFkZXIgb2YgdGhlCisjICQoRE9NQUlOKS5wb3QgZmlsZS4gIFNldCB0aGlzIHRvIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9mIHRoZSBzdXJyb3VuZGluZworIyBwYWNrYWdlLiAgKE5vdGUgdGhhdCB0aGUgbXNnc3RyIHN0cmluZ3MsIGV4dHJhY3RlZCBmcm9tIHRoZSBwYWNrYWdlJ3MKKyMgc291cmNlcywgYmVsb25nIHRvIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9mIHRoZSBwYWNrYWdlLikgIFRyYW5zbGF0b3JzIGFyZQorIyBleHBlY3RlZCB0byB0cmFuc2ZlciB0aGUgY29weXJpZ2h0IGZvciB0aGVpciB0cmFuc2xhdGlvbnMgdG8gdGhpcyBwZXJzb24KKyMgb3IgZW50aXR5LCBvciB0byBkaXNjbGFpbSB0aGVpciBjb3B5cmlnaHQuICBUaGUgZW1wdHkgc3RyaW5nIHN0YW5kcyBmb3IKKyMgdGhlIHB1YmxpYyBkb21haW47IGluIHRoaXMgY2FzZSB0aGUgdHJhbnNsYXRvcnMgYXJlIGV4cGVjdGVkIHRvIGRpc2NsYWltCisjIHRoZWlyIGNvcHlyaWdodC4KK0NPUFlSSUdIVF9IT0xERVIgPSBUaGUgQUxTQSBUZWFtCisKKyMgVGhpcyBpcyB0aGUgZW1haWwgYWRkcmVzcyBvciBVUkwgdG8gd2hpY2ggdGhlIHRyYW5zbGF0b3JzIHNoYWxsIHJlcG9ydAorIyBidWdzIGluIHRoZSB1bnRyYW5zbGF0ZWQgc3RyaW5nczoKKyMgLSBTdHJpbmdzIHdoaWNoIGFyZSBub3QgZW50aXJlIHNlbnRlbmNlcywgc2VlIHRoZSBtYWludGFpbmVyIGd1aWRlbGluZXMKKyMgICBpbiB0aGUgR05VIGdldHRleHQgZG9jdW1lbnRhdGlvbiwgc2VjdGlvbiAnUHJlcGFyaW5nIFN0cmluZ3MnLgorIyAtIFN0cmluZ3Mgd2hpY2ggdXNlIHVuY2xlYXIgdGVybXMgb3IgcmVxdWlyZSBhZGRpdGlvbmFsIGNvbnRleHQgdG8gYmUKKyMgICB1bmRlcnN0b29kLgorIyAtIFN0cmluZ3Mgd2hpY2ggbWFrZSBpbnZhbGlkIGFzc3VtcHRpb25zIGFib3V0IG5vdGF0aW9uIG9mIGRhdGUsIHRpbWUgb3IKKyMgICBtb25leS4KKyMgLSBQbHVyYWxpc2F0aW9uIHByb2JsZW1zLgorIyAtIEluY29ycmVjdCBFbmdsaXNoIHNwZWxsaW5nLgorIyAtIEluY29ycmVjdCBmb3JtYXR0aW5nLgorIyBJdCBjYW4gYmUgeW91ciBlbWFpbCBhZGRyZXNzLCBvciBhIG1haWxpbmcgbGlzdCBhZGRyZXNzIHdoZXJlIHRyYW5zbGF0b3JzCisjIGNhbiB3cml0ZSB0byB3aXRob3V0IGJlaW5nIHN1YnNjcmliZWQsIG9yIHRoZSBVUkwgb2YgYSB3ZWIgcGFnZSB0aHJvdWdoCisjIHdoaWNoIHRoZSB0cmFuc2xhdG9ycyBjYW4gY29udGFjdCB5b3UuCitNU0dJRF9CVUdTX0FERFJFU1MgPQorCisjIFRoaXMgaXMgdGhlIGxpc3Qgb2YgbG9jYWxlIGNhdGVnb3JpZXMsIGJleW9uZCBMQ19NRVNTQUdFUywgZm9yIHdoaWNoIHRoZQorIyBtZXNzYWdlIGNhdGFsb2dzIHNoYWxsIGJlIHVzZWQuICBJdCBpcyB1c3VhbGx5IGVtcHR5LgorRVhUUkFfTE9DQUxFX0NBVEVHT1JJRVMgPQpkaWZmIC0tZ2l0IGEvcG8vUE9URklMRVMuaW4gYi9wby9QT1RGSUxFUy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDFiOGVhCi0tLSAvZGV2L251bGwKKysrIGIvcG8vUE9URklMRVMuaW4KQEAgLTAsMCArMSwxMiBAQAorYWxzYW1peGVyL2NhcmRfc2VsZWN0LmMKK2Fsc2FtaXhlci9jbGkuYworYWxzYW1peGVyL2RldmljZV9uYW1lLmMKK2Fsc2FtaXhlci9kaWUuYworYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYworYWxzYW1peGVyL21peGVyX3dpZGdldC5jCithbHNhbWl4ZXIvcHJvY19maWxlcy5jCithbHNhbWl4ZXIvdGV4dGJveC5jCithcGxheS9hcGxheS5jCitzZXEvYWNvbm5lY3QvYWNvbm5lY3QuYworc2VxL2FzZXFuZXQvYXNlcW5ldC5jCitzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmMKZGlmZiAtLWdpdCBhL3BvL2RlLnBvIGIvcG8vZGUucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM0N2M2NQotLS0gL2Rldi9udWxsCisrKyBiL3BvL2RlLnBvCkBAIC0wLDAgKzEsMTU3NyBAQAorIyBHZXJtYW4gdHJhbnNsYXRpb25zIGZvciB0aGUgYWxzYS11dGlscyBwYWNrYWdlLgorIyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFMU0EgVGVhbQorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgYWxzYS11dGlscyBwYWNrYWdlLgorIyBDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4sIDIwMDkuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBhbHNhLXV0aWxzIDEuMC4yM1xuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBcbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxMC0xMS0wOCAyMTozMiswMTAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAxMC0xMS0wOSAyMToxMiswMTAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBHZXJtYW5cbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKworIzogYWxzYW1peGVyL2NhcmRfc2VsZWN0LmM6MTI2IGFsc2FtaXhlci9kZXZpY2VfbmFtZS5jOjEyNgorbXNnaWQgIlNvdW5kIENhcmQiCittc2dzdHIgIlNvdW5ka2FydGUiCisKKyM6IGFsc2FtaXhlci9jYXJkX3NlbGVjdC5jOjE4MQorbXNnaWQgIihkZWZhdWx0KSIKK21zZ3N0ciAiKFN0YW5kYXJkKSIKKworIzogYWxzYW1peGVyL2NhcmRfc2VsZWN0LmM6MTkxCittc2dpZCAiY2Fubm90IGVudW1lcmF0ZSBzb3VuZCBjYXJkcyIKK21zZ3N0ciAiRmVobGVyIGJlaW0gQXVmesOkaGxlbiBkZXIgU291bmRrYXJ0ZW4iCisKKyM6IGFsc2FtaXhlci9jYXJkX3NlbGVjdC5jOjIxNQorbXNnaWQgImVudGVyIGRldmljZSBuYW1lLi4uIgorbXNnc3RyICJHZXLDpHRlbmFtZW4gZWluZ2ViZW4uLi4iCisKKyM6IGFsc2FtaXhlci9jbGkuYzo0MAorbXNnaWQgIlVzYWdlOiBhbHNhbWl4ZXIgW29wdGlvbnNdIgorbXNnc3RyICJWZXJ3ZW5kdW5nOiBhbHNhbWl4ZXIgW09wdGlvbmVuXSIKKworIzogYWxzYW1peGVyL2NsaS5jOjQxCittc2dpZCAiIgorIlVzZWZ1bCBvcHRpb25zOlxuIgorIiAgLWgsIC0taGVscCAgICAgICAgICAgICAgdGhpcyBoZWxwXG4iCisiICAtYywgLS1jYXJkPU5VTUJFUiAgICAgICBzb3VuZCBjYXJkIG51bWJlciBvciBpZFxuIgorIiAgLUQsIC0tZGV2aWNlPU5BTUUgICAgICAgbWl4ZXIgZGV2aWNlIG5hbWVcbiIKKyIgIC1WLCAtLXZpZXc9TU9ERSAgICAgICAgIHN0YXJ0aW5nIHZpZXcgbW9kZTogcGxheWJhY2svY2FwdHVyZS9hbGwiCittc2dzdHIgIiIKKyJPcHRpb25lbjpcbiIKKyIgIC1oLCAtLWhlbHAgICAgICAgICAgICAgIEhpbGZlXG4iCisiICAtYywgLS1jYXJkPU5VTU1FUiAgICAgICBTb3VuZGthcnRlbi1OdW1tZXIgb2RlciAtSURcbiIKKyIgIC1ELCAtLWRldmljZT1OQU1FICAgICAgIE1peGVyLUdlcsOkdGVuYW1lXG4iCisiICAtViwgLS12aWV3PU1PRFVTICAgICAgICBBbnNpY2h0IGJlaW0gU3RhcnRlbjogcGxheWJhY2s9V2llZGVyZ2FiZSwgIgorImNhcHR1cmU9QXVmbmFobWUsIGFsbD1hbGxlIgorCisjOiBhbHNhbWl4ZXIvY2xpLmM6NDYKK21zZ2lkICIiCisiRGVidWdnaW5nIG9wdGlvbnM6XG4iCisiICAtZywgLS1uby1jb2xvciAgICAgICAgICB0b2dnbGUgdXNpbmcgb2YgY29sb3JzXG4iCisiICAtYSwgLS1hYnN0cmFjdGlvbj1OQU1FICBtaXhlciBhYnN0cmFjdGlvbiBsZXZlbDogbm9uZS9iYXNpYyIKK21zZ3N0ciAiIgorIkRlYnVnZ2luZy1PcHRpb25lbjpcbiIKKyIgIC1nLCAtLW5vLWNvbG9yICAgICAgICAgIGtlaW5lIEZhcmJlblxuIgorIiAgLWEsIC0tYWJzdHJhY3Rpb249TkFNRSAgTWl4ZXItQWJzdHJha3Rpb246IG5vbmUvYmFzaWMiCisKKyM6IGFsc2FtaXhlci9jbGkuYzo3NworIywgYy1mb3JtYXQKK21zZ2lkICJpbnZhbGlkIGNhcmQgaW5kZXg6ICVzXG4iCittc2dzdHIgInVuZ8O8bHRpZ2UgS2FydGVuLU51bW1lcjogJXNcbiIKKworIzogYWxzYW1peGVyL2NsaS5jOjEwMworIywgYy1mb3JtYXQKK21zZ2lkICJ1bmtub3duIGFic3RyYWN0aW9uIGxldmVsOiAlc1xuIgorbXNnc3RyICJ1bmJla2FubnRlIEFic3RyYWt0aW9uOiAlc1xuIgorCisjOiBhbHNhbWl4ZXIvY2xpLmM6MTA4CisjLCBjLWZvcm1hdAorbXNnaWQgInVua25vd24gb3B0aW9uOiAlY1xuIgorbXNnc3RyICJ1bmJla2FubnRlIE9wdGlvbjogJWNcbiIKKworIzogYWxzYW1peGVyL2NsaS5jOjExMAorbXNnaWQgInRyeSBgYWxzYW1peGVyIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb25cbiIKK21zZ3N0ciAic2llaGUgYGFsc2FtaXhlciAtLWhlbHAnIGbDvHIgbWVociBJbmZvcm1hdGlvbmVuXG4iCisKKyM6IGFsc2FtaXhlci9kZXZpY2VfbmFtZS5jOjE3NworbXNnaWQgIkRldmljZSBuYW1lOiIKK21zZ3N0ciAiR2Vyw6R0ZW5hbWU6IgorCisjOiBhbHNhbWl4ZXIvZGllLmM6MzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6ICVzXG4iCittc2dzdHIgIiVzOiAlc1xuIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjk1Cittc2dpZCAiQ2FyZDoiCittc2dzdHIgIkdlcsOkdDoiCisKKyM6IGFsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6OTYKK21zZ2lkICJDaGlwOiIKK21zZ3N0ciAiQ2hpcDoiCisKKyM6IGFsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6OTcKK21zZ2lkICJWaWV3OiIKK21zZ3N0ciAiQW5zaWNodDoiCisKKyM6IGFsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6OTgKK21zZ2lkICJJdGVtOiIKK21zZ3N0ciAiRWxlbWVudDoiCisKKyM6IGFsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6MTAxCittc2dpZCAiRjE6ICBIZWxwIgorbXNnc3RyICJGMTogIEhpbGZlIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjEwMgorbXNnaWQgIkYyOiAgU3lzdGVtIGluZm9ybWF0aW9uIgorbXNnc3RyICJGMjogIFN5c3RlbS1JbmZvcm1hdGlvbmVuIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjEwMworbXNnaWQgIkY2OiAgU2VsZWN0IHNvdW5kIGNhcmQiCittc2dzdHIgIkY2OiAgU291bmRrYXJ0ZSBhdXN3w6RobGVuIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjEwNAorbXNnaWQgIkVzYzogRXhpdCIKK21zZ3N0ciAiRXNjOiBCZWVuZGVuIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjE3MQorbXNnaWQgIih1bnBsdWdnZWQpIgorbXNnc3RyICIoZW50ZmVybnQpIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjE4OQorbXNnaWQgIlBsYXliYWNrIgorbXNnc3RyICJXaWVkZXJnYWJlIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjE5MAorbXNnaWQgIkNhcHR1cmUiCittc2dzdHIgIkF1Zm5haG1lIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjE5MQorbXNnaWQgIkFsbCIKK21zZ3N0ciAiQWxsZSIKKworIzogYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzoyMzEKK21zZ2lkICJtdXRlIgorbXNnc3RyICJzdHVtbSIKKworIzogYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzoyNzIgYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzoyODIKK21zZ2lkICJkQiBnYWluOiIKK21zZ3N0ciAiZEItw4RuZGVydW5nOiIKKworIzogYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzoyODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiIFslcyAlcywgJXNdIgorbXNnc3RyICIgWyVzICVzOyAlc10iCisKKyM6IGFsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6MjkxIGFsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6Mjk3CisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjMwMyBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjMwOQorbXNnaWQgIk9mZiIKK21zZ3N0ciAiQXVzIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjI5NyBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjMwOQorbXNnaWQgIk9uIgorbXNnc3RyICJBbiIKKworIzogYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzozNjAKK21zZ2lkICJUaGUgc291bmQgZGV2aWNlIHdhcyB1bnBsdWdnZWQuIgorbXNnc3RyICJEYXMgR2Vyw6R0IHd1cmRlIGVudGZlcm50LiIKKworIzogYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzozNjEKK21zZ2lkICJQcmVzcyBGNiB0byBzZWxlY3QgYW5vdGhlciBzb3VuZCBjYXJkLiIKK21zZ3N0ciAiRHLDvGNrZW4gU2llIEY2LCB1bSBlaW5lIGFuZGVyZSBTb3VuZGthcnRlIGF1c3p1d8OkaGxlbi4iCisKKyM6IGFsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6Mzc2Cittc2dpZCAiVGhpcyBzb3VuZCBkZXZpY2UgZG9lcyBub3QgaGF2ZSBhbnkgcGxheWJhY2sgY29udHJvbHMuIgorbXNnc3RyICJEaWVzZXMgR2Vyw6R0IGhhdCBrZWluZSBXaWVkZXJnYWJlLVJlZ2xlci4iCisKKyM6IGFsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6Mzc4Cittc2dpZCAiVGhpcyBzb3VuZCBkZXZpY2UgZG9lcyBub3QgaGF2ZSBhbnkgY2FwdHVyZSBjb250cm9scy4iCittc2dzdHIgIkRpZXNlcyBHZXLDpHQgaGF0IGtlaW5lIEF1Zm5haG1lLVJlZ2xlci4iCisKKyM6IGFsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6MzgwCittc2dpZCAiVGhpcyBzb3VuZCBkZXZpY2UgZG9lcyBub3QgaGF2ZSBhbnkgY29udHJvbHMuIgorbXNnc3RyICJEaWVzZXMgR2Vyw6R0IGhhdCBrZWluZSBSZWdsZXIuIgorCisjLiBUUkFOU0xBVE9SUzogcGxheWJhY2sgb247IG9uZSBjaGFyYWN0ZXIKKyM6IGFsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6NTM3IGFsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6NTQyCittc2dpZCAiTyIKK21zZ3N0ciAiTyIKKworIy4gVFJBTlNMQVRPUlM6IHBsYXliYWNrIG11dGVkOyBvbmUgY2hhcmFjdGVyCisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjUzOSBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjU0MworbXNnaWQgIk0iCittc2dzdHIgIk0iCisKKyMuIFRSQU5TTEFUT1JTOiAibGVmdCI7IG5vIG1vcmUgdGhhbiB0d28gY2hhcmFjdGVycworIzogYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzo1NTcKK21zZ2lkICJMIgorbXNnc3RyICJMIgorCisjLiBUUkFOU0xBVE9SUzogInJpZ2h0Ijsgbm8gbW9yZSB0aGFuIHR3byBjaGFyYWN0ZXJzCisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjU2MQorbXNnaWQgIlIiCittc2dzdHIgIlIiCisKKyMuIFRSQU5TTEFUT1JTOiBubyBtb3JlIHRoYW4gZWlnaHQgY2hhcmFjdGVycworIzogYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzo1NjMKK21zZ2lkICJDQVBUVVJFIgorbXNnc3RyICJBVUZOQUhNRSIKKworIzogYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzo2MTMKK21zZ2lkICJGcm9udCIKK21zZ3N0ciAiVm9ybmUiCisKKyM6IGFsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6NjE2Cittc2dpZCAiUmVhciIKK21zZ3N0ciAiSGludGVuIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjYxOSBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6MTA4Cittc2dpZCAiQ2VudGVyIgorbXNnc3RyICJNaXR0ZSIKKworIzogYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzo2MjIKK21zZ2lkICJXb29mZXIiCittc2dzdHIgIkJhc3MiCisKKyM6IGFsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6NjI1Cittc2dpZCAiU2lkZSIKK21zZ3N0ciAiU2VpdGVuIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6ODMgYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjg4Cittc2dpZCAiY2Fubm90IG9wZW4gbWl4ZXIiCittc2dzdHIgIkZlaGxlciBiZWltIMOWZmZlbiBkZXMgTWl4ZXItR2Vyw6R0ZXMiCisKKyM6IGFsc2FtaXhlci9taXhlcl93aWRnZXQuYzo5NCBhbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MTcxCittc2dpZCAiY2Fubm90IGxvYWQgbWl4ZXIgY29udHJvbHMiCittc2dzdHIgIkZlaGxlciBiZWltIExhZGVuIGRlciBNaXhlci1SZWdsZXIiCisKKyM6IGFsc2FtaXhlci9taXhlcl93aWRnZXQuYzoxNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IG9wZW4gbWl4ZXIgZGV2aWNlICclcycuIgorbXNnc3RyICJGZWhsZXIgYmVpbSDDlmZmbmVuIGRlcyBNaXhlci1HZXLDpHRlcyAnJXMnLiIKKworIzogYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjE4MgorbXNnaWQgIkVzYyAgICAgRXhpdCIKK21zZ3N0ciAiRXNjICAgICBCZWVuZGVuIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MTgzCittc2dpZCAiRjEgPyBIICBIZWxwIgorbXNnc3RyICJGMSA/IEggIEhpbGZlIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MTg0Cittc2dpZCAiRjIgLyAgICBTeXN0ZW0gaW5mb3JtYXRpb24iCittc2dzdHIgIkYyIC8gICAgU3lzdGVtLUluZm9ybWF0aW9uZW4iCisKKyM6IGFsc2FtaXhlci9taXhlcl93aWRnZXQuYzoxODUKK21zZ2lkICJGMyAgICAgIFNob3cgcGxheWJhY2sgY29udHJvbHMiCittc2dzdHIgIkYzICAgICAgQW5zaWNodCBXaWVkZXJnYWJlLVJlZ2xlciIKKworIzogYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjE4NgorbXNnaWQgIkY0ICAgICAgU2hvdyBjYXB0dXJlIGNvbnRyb2xzIgorbXNnc3RyICJGNCAgICAgIEFuc2ljaHQgQXVmbmFobWUtUmVnbGVyIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MTg3Cittc2dpZCAiRjUgICAgICBTaG93IGFsbCBjb250cm9scyIKK21zZ3N0ciAiRjUgICAgICBBbnNpY2h0IGFsbGUgUmVnbGVyIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MTg4Cittc2dpZCAiVGFiICAgICBUb2dnbGUgdmlldyBtb2RlIChGMy9GNC9GNSkiCittc2dzdHIgIlRhYiAgICAgQW5zaWNodHMtTW9kdXMgdW1zY2hhbHRlbiAoRjMvRjQvRjUpIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MTg5Cittc2dpZCAiRjYgUyAgICBTZWxlY3Qgc291bmQgY2FyZCIKK21zZ3N0ciAiRjYgUyAgICBTb3VuZGthcnRlIGF1c3fDpGhsZW4iCisKKyM6IGFsc2FtaXhlci9taXhlcl93aWRnZXQuYzoxOTAKK21zZ2lkICJMICAgICAgIFJlZHJhdyBzY3JlZW4iCittc2dzdHIgIkwgICAgICAgQmlsZHNjaGlybSBuZXUgZGFyc3RlbGxlbiIKKworIzogYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjE5MgorbXNnaWQgIkxlZnQgICAgTW92ZSB0byB0aGUgcHJldmlvdXMgY29udHJvbCIKK21zZ3N0ciAiTGlua3MgICBnZWhlIHp1bSB2b3JoZXJpZ2VuIFJlZ2xlciIKKworIzogYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjE5MworbXNnaWQgIlJpZ2h0ICAgTW92ZSB0byB0aGUgbmV4dCBjb250cm9sIgorbXNnc3RyICJSZWNodHMgIGdlaGUgenVtIG7DpGNoc3RlbiBSZWdsZXIiCisKKyM6IGFsc2FtaXhlci9taXhlcl93aWRnZXQuYzoxOTUKK21zZ2lkICJVcC9Eb3duICAgIENoYW5nZSB2b2x1bWUiCittc2dzdHIgIk9iZW4vVW50ZW4gIExhdXRzdMOkcmtlIMOkbmRlcm4iCisKKyM6IGFsc2FtaXhlci9taXhlcl93aWRnZXQuYzoxOTYKK21zZ2lkICIrIC0gICAgICAgIENoYW5nZSB2b2x1bWUiCittc2dzdHIgIisgLSAgICAgICAgIExhdXRzdMOkcmtlIMOkbmRlcm4iCisKKyM6IGFsc2FtaXhlci9taXhlcl93aWRnZXQuYzoxOTcKK21zZ2lkICJQYWdlIFVwL0RuIENoYW5nZSB2b2x1bWUgaW4gYmlnIHN0ZXBzIgorbXNnc3RyICJCaWxkIF4vdiAgICBMYXV0c3TDpHJrZSBpbiBncm/Dn2VuIFNjaHJpdHRlbiDDpG5kZXJuIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MTk4Cittc2dpZCAiRW5kICAgICAgICBTZXQgdm9sdW1lIHRvIDAlIgorbXNnc3RyICJFbmRlICAgICAgICBMYXV0c3TDpHJrZSBhdWYgMCUgc2V0emVuIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MTk5Cittc2dpZCAiMC05ICAgICAgICBTZXQgdm9sdW1lIHRvIDAlLTkwJSIKK21zZ3N0ciAiMC05ICAgICAgICAgTGF1dHN0w6Rya2UgYXVmIDAlLTkwJSBzZXR6ZW4iCisKKyM6IGFsc2FtaXhlci9taXhlcl93aWRnZXQuYzoyMDAKK21zZ2lkICJRIFcgRSAgICAgIEluY3JlYXNlIGxlZnQvYm90aC9yaWdodCB2b2x1bWVzIgorbXNnc3RyICJRIFcgRSAgICAgICBsaW5rZS9iZWlkZS9yZWNodGUgTGF1dHN0w6Rya2UgZXJow7ZoZW4iCisKKyMuIFRSQU5TTEFUT1JTOiBvciBZIGluc3RlYWQgb2YgWgorIzogYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjIwMgorbXNnaWQgIlogWCBDICAgICAgRGVjcmVhc2UgbGVmdC9ib3RoL3JpZ2h0IHZvbHVtZXMiCittc2dzdHIgIlkgWCBDICAgICAgIGxpbmtlL2JlaWRlL3JlY2h0ZSBMYXV0c3TDpHJrZSB2ZXJyaW5nZXJuIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MjAzCittc2dpZCAiQiAgICAgICAgICBCYWxhbmNlIGxlZnQgYW5kIHJpZ2h0IHZvbHVtZXMiCittc2dzdHIgIkIgICAgICAgICAgIGxpbmtlIHVuZCByZWNodGUgTGF1dHN0w6Rya2UgYW5nbGVpY2hlbiIKKworIzogYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjIwNQorbXNnaWQgIk0gICAgICAgICAgVG9nZ2xlIG11dGUiCittc2dzdHIgIk0gICAgICAgICAgIHN0dW1tIHVtc2NoYWx0ZW4iCisKKyMuIFRSQU5TTEFUT1JTOiBvciAsIC4KKyM6IGFsc2FtaXhlci9taXhlcl93aWRnZXQuYzoyMDcKK21zZ2lkICI8ID4gICAgICAgIFRvZ2dsZSBsZWZ0L3JpZ2h0IG11dGUiCittc2dzdHIgIiwgLiAgICAgICAgIHN0dW1tIGxpbmtzL3JlY2h0cyB1bXNjaGFsdGVuIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MjA5Cittc2dpZCAiU3BhY2UgICAgICBUb2dnbGUgY2FwdHVyZSIKK21zZ3N0ciAiTGVlcnRhc3RlICAgQXVmbmFobWUgdW1zY2hhbHRlbiIKKworIy4gVFJBTlNMQVRPUlM6IG9yIEluc2VydCBEZWxldGUKKyM6IGFsc2FtaXhlci9taXhlcl93aWRnZXQuYzoyMTEKK21zZ2lkICI7ICcgICAgICAgIFRvZ2dsZSBsZWZ0L3JpZ2h0IGNhcHR1cmUiCittc2dzdHIgIkVpbmZnIEVudGYgIEF1Zm5haG1lIGxpbmtzL3JlY2h0cyB1bXNjaGFsdGVuIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MjEzCittc2dpZCAiQXV0aG9yczoiCittc2dzdHIgIkF1dG9yZW46IgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MjE0Cittc2dpZCAiICBUaW0gSmFuaWsiCittc2dzdHIgIiAgVGltIEphbmlrIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MjE1Cittc2dpZCAiICBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PiIKK21zZ3N0ciAiICBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PiIKKworIzogYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjIxNgorbXNnaWQgIiAgQ2xlbWVucyBMYWRpc2NoIDxjbGVtZW5zQGxhZGlzY2guZGU+IgorbXNnc3RyICIgIENsZW1lbnMgTGFkaXNjaCA8Y2xlbWVuc0BsYWRpc2NoLmRlPiIKKworIzogYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjIxOAorbXNnaWQgIkhlbHAiCittc2dzdHIgIkhpbGZlIgorCisjOiBhbHNhbWl4ZXIvcHJvY19maWxlcy5jOjEwMworbXNnaWQgIlNlbGVjdCBGaWxlIgorbXNnc3RyICJEYXRlaSB3w6RobGVuIgorCisjOiBhbHNhbWl4ZXIvdGV4dGJveC5jOjUyIGFsc2FtaXhlci90ZXh0Ym94LmM6NjYKK21zZ2lkICJFcnJvciIKK21zZ3N0ciAiRmVobGVyIgorCisjOiBhbHNhbWl4ZXIvdGV4dGJveC5jOjgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBvcGVuIGZpbGUgXCIlc1wiLiIKK21zZ3N0ciAiRmVobGVyIGJlaW0gw5ZmZm5lbiBkZXIgRGF0ZWkgXCIlc1wiLiIKKworIzogYXBsYXkvYXBsYXkuYzoxNTIKK21zZ2lkICJyYXcgZGF0YSIKK21zZ3N0ciAiUm9oZGF0ZW4iCisKKyM6IGFwbGF5L2FwbGF5LmM6MTUzCittc2dpZCAiVk9DIgorbXNnc3RyICJWT0MiCisKKyM6IGFwbGF5L2FwbGF5LmM6MTU1Cittc2dpZCAiV0FWRSIKK21zZ3N0ciAiV0FWRSIKKworIzogYXBsYXkvYXBsYXkuYzoxNTYKK21zZ2lkICJTcGFyYyBBdWRpbyIKK21zZ3N0ciAiU3BhcmMtQXVkaW8iCisKKyM6IGFwbGF5L2FwbGF5LmM6MTc3CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJVc2FnZTogJXMgW09QVElPTl0uLi4gW0ZJTEVdLi4uXG4iCisiXG4iCisiLWgsIC0taGVscCAgICAgICAgICAgICAgaGVscFxuIgorIiAgICAtLXZlcnNpb24gICAgICAgICAgIHByaW50IGN1cnJlbnQgdmVyc2lvblxuIgorIi1sLCAtLWxpc3QtZGV2aWNlcyAgICAgIGxpc3QgYWxsIHNvdW5kY2FyZHMgYW5kIGRpZ2l0YWwgYXVkaW8gZGV2aWNlc1xuIgorIi1MLCAtLWxpc3QtcGNtcyAgICAgICAgIGxpc3QgZGV2aWNlIG5hbWVzXG4iCisiLUQsIC0tZGV2aWNlPU5BTUUgICAgICAgc2VsZWN0IFBDTSBieSBuYW1lXG4iCisiLXEsIC0tcXVpZXQgICAgICAgICAgICAgcXVpZXQgbW9kZVxuIgorIi10LCAtLWZpbGUtdHlwZSBUWVBFICAgIGZpbGUgdHlwZSAodm9jLCB3YXYsIHJhdyBvciBhdSlcbiIKKyItYywgLS1jaGFubmVscz0jICAgICAgICBjaGFubmVsc1xuIgorIi1mLCAtLWZvcm1hdD1GT1JNQVQgICAgIHNhbXBsZSBmb3JtYXQgKGNhc2UgaW5zZW5zaXRpdmUpXG4iCisiLXIsIC0tcmF0ZT0jICAgICAgICAgICAgc2FtcGxlIHJhdGVcbiIKKyItZCwgLS1kdXJhdGlvbj0jICAgICAgICBpbnRlcnJ1cHQgYWZ0ZXIgIyBzZWNvbmRzXG4iCisiLU0sIC0tbW1hcCAgICAgICAgICAgICAgbW1hcCBzdHJlYW1cbiIKKyItTiwgLS1ub25ibG9jayAgICAgICAgICBub25ibG9ja2luZyBtb2RlXG4iCisiLUYsIC0tcGVyaW9kLXRpbWU9IyAgICAgZGlzdGFuY2UgYmV0d2VlbiBpbnRlcnJ1cHRzIGlzICMgbWljcm9zZWNvbmRzXG4iCisiLUIsIC0tYnVmZmVyLXRpbWU9IyAgICAgYnVmZmVyIGR1cmF0aW9uIGlzICMgbWljcm9zZWNvbmRzXG4iCisiICAgIC0tcGVyaW9kLXNpemU9IyAgICAgZGlzdGFuY2UgYmV0d2VlbiBpbnRlcnJ1cHRzIGlzICMgZnJhbWVzXG4iCisiICAgIC0tYnVmZmVyLXNpemU9IyAgICAgYnVmZmVyIGR1cmF0aW9uIGlzICMgZnJhbWVzXG4iCisiLUEsIC0tYXZhaWwtbWluPSMgICAgICAgbWluIGF2YWlsYWJsZSBzcGFjZSBmb3Igd2FrZXVwIGlzICMgbWljcm9zZWNvbmRzXG4iCisiLVIsIC0tc3RhcnQtZGVsYXk9IyAgICAgZGVsYXkgZm9yIGF1dG9tYXRpYyBQQ00gc3RhcnQgaXMgIyBtaWNyb3NlY29uZHMgXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgKHJlbGF0aXZlIHRvIGJ1ZmZlciBzaXplIGlmIDw9IDApXG4iCisiLVQsIC0tc3RvcC1kZWxheT0jICAgICAgZGVsYXkgZm9yIGF1dG9tYXRpYyBQQ00gc3RvcCBpcyAjIG1pY3Jvc2Vjb25kcyBmcm9tICIKKyJ4cnVuXG4iCisiLXYsIC0tdmVyYm9zZSAgICAgICAgICAgc2hvdyBQQ00gc3RydWN0dXJlIGFuZCBzZXR1cCAoYWNjdW11bGF0aXZlKVxuIgorIi1WLCAtLXZ1bWV0ZXI9VFlQRSAgICAgIGVuYWJsZSBWVSBtZXRlciAoVFlQRTogbW9ubyBvciBzdGVyZW8pXG4iCisiLUksIC0tc2VwYXJhdGUtY2hhbm5lbHMgb25lIGZpbGUgZm9yIGVhY2ggY2hhbm5lbFxuIgorIiAgICAtLWRpc2FibGUtcmVzYW1wbGUgIGRpc2FibGUgYXV0b21hdGljIHJhdGUgcmVzYW1wbGVcbiIKKyIgICAgLS1kaXNhYmxlLWNoYW5uZWxzICBkaXNhYmxlIGF1dG9tYXRpYyBjaGFubmVsIGNvbnZlcnNpb25zXG4iCisiICAgIC0tZGlzYWJsZS1mb3JtYXQgICAgZGlzYWJsZSBhdXRvbWF0aWMgZm9ybWF0IGNvbnZlcnNpb25zXG4iCisiICAgIC0tZGlzYWJsZS1zb2Z0dm9sICAgZGlzYWJsZSBzb2Z0d2FyZSB2b2x1bWUgY29udHJvbCAoc29mdHZvbClcbiIKKyIgICAgLS10ZXN0LXBvc2l0aW9uICAgICB0ZXN0IHJpbmcgYnVmZmVyIHBvc2l0aW9uXG4iCisiICAgIC0tdGVzdC1jb2VmPSNcdCB0ZXN0IGNvZWZpY2llbnQgZm9yIHJpbmcgYnVmZmVyIHBvc2l0aW9uIChkZWZhdWx0IDgpXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiBmb3IgdmFsaWRhdGlvbiBpczogY29lZiAqIChidWZmZXJfc2l6ZSAvICIKKyIyKVxuIgorIiAgICAtLXRlc3Qtbm93YWl0ICAgICAgIGRvIG5vdCB3YWl0IGZvciByaW5nIGJ1ZmZlciAtIGVhdHMgd2hvbGUgQ1BVXG4iCisiICAgIC0tbWF4LWZpbGUtdGltZT0jICAgc3RhcnQgYW5vdGhlciBvdXRwdXQgZmlsZSB3aGVuIHRoZSBvbGQgZmlsZSBoYXMgIgorInJlY29yZGVkXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoaXMgbWFueSBzZWNvbmRzXG4iCisiICAgIC0tcHJvY2Vzcy1pZC1maWxlICAgd3JpdGUgdGhlIHByb2Nlc3MgSUQgaGVyZVxuIgorIiAgICAtLXVzZS1zdHJmdGltZSAgICAgIGFwcGx5IHRoZSBzdHJmdGltZSBmYWNpbGl0eSB0byB0aGUgb3V0cHV0IGZpbGUgbmFtZVxuIgorbXNnc3RyICIiCisiVmVyd2VuZHVuZzogJXMgW09wdGlvbl0uLi4gW0RhdGVpXS4uLlxuIgorIlxuIgorIi1oLCAtLWhlbHAgICAgICAgICAgICAgIEhpbGZlXG4iCisiICAgIC0tdmVyc2lvbiAgICAgICAgICAgVmVyc2lvbiBhbnplaWdlblxuIgorIi1sLCAtLWxpc3QtZGV2aWNlcyAgICAgIGFsbGUgU291bmRrYXJ0ZW4gdW5kIC1HZXLDpHRlIGF1Zmxpc3RlblxuIgorIi1MLCAtLWxpc3QtcGNtcyAgICAgICAgIEFMU0EtR2Vyw6R0ZW5hbWVuIGF1Zmxpc3RlblxuIgorIi1ELCAtLWRldmljZT1OQU1FICAgICAgIFBDTS1HZXLDpHQgd8OkaGxlblxuIgorIi1xLCAtLXF1aWV0ICAgICAgICAgICAgIHdlbmlnZXIgUHJvZ3JhbW1hdXNnYWJlblxuIgorIi10LCAtLWZpbGUtdHlwZSBUWVAgICAgIERhdGVpdHlwICh2b2MsIHdhdiwgcmF3IG9kZXIgYXUpXG4iCisiLWMsIC0tY2hhbm5lbHM9IyAgICAgICAgS2Fuw6RsZVxuIgorIi1mLCAtLWZvcm1hdD1GT1JNQVQgICAgIFNhbXBsZS1Gb3JtYXRcbiIKKyItciwgLS1yYXRlPSMgICAgICAgICAgICBTYW1wbGUtUmF0ZVxuIgorIi1kLCAtLWR1cmF0aW9uPSMgICAgICAgIEJlZW5kZW4gbmFjaCAjIFNla3VuZGVuXG4iCisiLU0sIC0tbW1hcCAgICAgICAgICAgICAgbW1hcC1Nb2R1c1xuIgorIi1OLCAtLW5vbmJsb2NrICAgICAgICAgIG5vbmJsb2NraW5nLU1vZHVzXG4iCisiLUYsIC0tcGVyaW9kLXRpbWU9IyAgICAgQWJzdGFuZCB6d2lzY2hlbiBJbnRlcnJ1cHRzIGlzdCAjIMK1c1xuIgorIi1CLCAtLWJ1ZmZlci10aW1lPSMgICAgIFB1ZmZlci1Mw6RuZ2UgaXN0ICMgwrVzXG4iCisiICAgIC0tcGVyaW9kLXNpemU9IyAgICAgQWJzdGFuZCB6d2lzY2hlbiBJbnRlcnJ1cHRzIGlzdCAjIEZyYW1lc1xuIgorIiAgICAtLWJ1ZmZlci1zaXplPSMgICAgIFB1ZmZlci1Mw6RuZ2UgaXN0ICMgRnJhbWVzXG4iCisiLUEsIC0tYXZhaWwtbWluPSMgICAgICAgZnJlaWVyIFB1ZmZlcnNwZWljaGVyIGbDvHIgV2FrZXVwIGlzdCAjIMK1c1xuIgorIi1SLCAtLXN0YXJ0LWRlbGF5PSMgICAgIFB1ZmZlci1Gw7xsbGdyYWQgenVtIGF1dG9tYXRpc2NoZW4gUENNLVN0YXJ0LCBpbiDCtXNcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAod2VubiA8PSAwLCBmcmVpZXIgUHVmZmVyLVNwZWljaGVyKVxuIgorIi1ULCAtLXN0b3AtZGVsYXk9IyAgICAgIFplaXQgdm9yIHhydW4genVtIGF1dG9tYXRpc2NoZW4gUENNLVN0b3AsIGluIMK1c1xuIgorIi12LCAtLXZlcmJvc2UgICAgICAgICAgIHplaWdlIFBDTS1TdHJ1a3R1ciB1bmQgLUtvbmZpZ3VyYXRpb24gKGFra3VtdWxhdGl2KVxuIgorIi1WLCAtLXZ1bWV0ZXI9VFlQICAgICAgIFZVLUFuemVpZ2UgKFRZUDogbW9ubyBvZGVyIHN0ZXJlbylcbiIKKyItSSwgLS1zZXBhcmF0ZS1jaGFubmVscyBlaW5lIERhdGVpIHBybyBLYW5hbFxuIgorIiAgICAtLWRpc2FibGUtcmVzYW1wbGUgIGtlaW5lIGF1dG9tYXRpc2NoZSBTYW1wbGUtUmF0ZS1BbnBhc3N1bmdcbiIKKyIgICAgLS1kaXNhYmxlLWNoYW5uZWxzICBrZWluZSBhdXRvbWF0aXNjaGUgS2FuYWwtQW56YWhsLUFucGFzc3VuZ1xuIgorIiAgICAtLWRpc2FibGUtZm9ybWF0ICAgIGtlaW5lIGF1dG9tYXRpc2NoZSBGb3JtYXQtQW5wYXNzdW5nXG4iCisiICAgIC0tZGlzYWJsZS1zb2Z0dm9sICAga2VpbiBTb2Z0d2FyZS1MYXV0c3TDpHJrZS1SZWdsZXIgKHNvZnR2b2wpXG4iCisiICAgIC0tdGVzdC1wb3NpdGlvbiAgICAgw7xiZXJwcsO8ZmUgUG9zaXRpb24gaW0gUmluZy1QdWZmZXJcbiIKKyIgICAgLS10ZXN0LWNvZWY9IyAgICAgICBUZXN0LUtvZWZmaXppZW50IGbDvHIgUG9zaXRpb25zcHLDvGZ1bmcgKFN0YW5kYXJkIDgpXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWVsIGbDvHIgUHLDvGZ1bmcgaXN0OiBLb2VmZml6aWVudCAqIChQdWZmZXJncsO2w59lIC8gIgorIjIpXG4iCisiICAgIC0tdGVzdC1ub3dhaXQgICAgICAga2VpbiBXYXJ0ZW4gYXVmIFJpbmdwdWZmZXI7IGJlYW5zcHJ1Y2h0IHZvbGxlIENQVS0iCisiTGVpc3R1bmdcbiIKKyIgICAgLS1tYXgtZmlsZS10aW1lPSMgICBlcnpldWdlIG1laHJlcmUgRGF0ZWllbjsgV2VjaHNlbCBuYWNoICMgU2VrdW5kZW5cbiIKKyIgICAgLS1wcm9jZXNzLWlkLWZpbGU9IyBzY2hyZWliZSBQcm96ZXNzLUlEIGluIGRpZXNlIERhdGVpXG4iCisiICAgIC0tdXNlLXN0cmZ0aW1lICAgICAgZm9ybWF0aWVyZSBEYXRlaW5hbWUgbWl0IHN0cmZ0aW1lOyAlJXY9RGF0ZWludW1tZXJcbiIKKworIzogYXBsYXkvYXBsYXkuYzoyMTYgc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjgxOQorIywgYy1mb3JtYXQKK21zZ2lkICJSZWNvZ25pemVkIHNhbXBsZSBmb3JtYXRzIGFyZToiCittc2dzdHIgIlVudGVyc3TDvHR6dGUgU2FtcGxlLUZvcm1hdGU6IgorCisjOiBhcGxheS9hcGxheS5jOjIyMgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiU29tZSBvZiB0aGVzZSBtYXkgbm90IGJlIGF2YWlsYWJsZSBvbiBzZWxlY3RlZCBoYXJkd2FyZVxuIgorbXNnc3RyICIiCisiXG4iCisiTmljaHQgYWxsZSBkYXZvbiBzaW5kIGF1ZiBqZWRlciBIYXJkd2FyZSB2ZXJmw7xnYmFyLlxuIgorCisjOiBhcGxheS9hcGxheS5jOjIyMworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgYXZhaWxhYmxlZCBmb3JtYXQgc2hvcnRjdXRzIGFyZTpcbiIKK21zZ3N0ciAiVW50ZXJzdMO8dHplIEZvcm1hdC1BYmvDvHJ6dW5nZW46XG4iCisKKyM6IGFwbGF5L2FwbGF5LmM6MjI0CisjLCBjLWZvcm1hdAorbXNnaWQgIi1mIGNkICgxNiBiaXQgbGl0dGxlIGVuZGlhbiwgNDQxMDAsIHN0ZXJlbylcbiIKK21zZ3N0ciAiLWYgY2QgKDE2IEJpdHMsIExpdHRsZSBFbmRpYW4sIDQ0MTAwIEh6LCBzdGVyZW8pXG4iCisKKyM6IGFwbGF5L2FwbGF5LmM6MjI1CisjLCBjLWZvcm1hdAorbXNnaWQgIi1mIGNkciAoMTYgYml0IGJpZyBlbmRpYW4sIDQ0MTAwLCBzdGVyZW8pXG4iCittc2dzdHIgIi1mIGNkciAoMTYgQml0cywgQmlnIEVuZGlhbiwgNDQxMDAgSHosIHN0ZXJlbylcbiIKKworIzogYXBsYXkvYXBsYXkuYzoyMjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiLWYgZGF0ICgxNiBiaXQgbGl0dGxlIGVuZGlhbiwgNDgwMDAsIHN0ZXJlbylcbiIKK21zZ3N0ciAiLWYgZGF0ICgxNiBCaXRzLCBMaXR0bGUgRW5kaWFuLCA0ODAwMCBIeiwgc3RlcmVvKVxuIgorCisjOiBhcGxheS9hcGxheS5jOjI0MAorbXNnaWQgIm5vIHNvdW5kY2FyZHMgZm91bmQuLi4iCittc2dzdHIgImtlaW5lIFNvdW5ka2FydGVuIGdlZnVuZGVuIC4uLiIKKworIzogYXBsYXkvYXBsYXkuYzoyNDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiKioqKiBMaXN0IG9mICVzIEhhcmR3YXJlIERldmljZXMgKioqKlxuIgorbXNnc3RyICIqKioqIExpc3RlIGRlciBIYXJkd2FyZS1HZXLDpHRlICglcykgKioqKlxuIgorCisjOiBhcGxheS9hcGxheS5jOjI3MgorIywgYy1mb3JtYXQKK21zZ2lkICJjYXJkICVpOiAlcyBbJXNdLCBkZXZpY2UgJWk6ICVzIFslc11cbiIKK21zZ3N0ciAiS2FydGUgJWk6ICVzIFslc10sIEdlcsOkdCAlaTogJXMgWyVzXVxuIgorCisjOiBhcGxheS9hcGxheS5jOjI3OAorIywgYy1mb3JtYXQKK21zZ2lkICIgIFN1YmRldmljZXM6ICVpLyVpXG4iCittc2dzdHIgIiAgU3ViLUdlcsOkdGU6ICVpLyVpXG4iCisKKyM6IGFwbGF5L2FwbGF5LmM6Mjg1CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgU3ViZGV2aWNlICMlaTogJXNcbiIKK21zZ3N0ciAiICBTdWItR2Vyw6R0ICMlaTogJXNcbiIKKworIzogYXBsYXkvYXBsYXkuYzozNjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiQWJvcnRlZCBieSBzaWduYWwgJXMuLi5cbiIKK21zZ3N0ciAiQWJicnVjaCBkdXJjaCBTaWduYWwgJXMgLi4uXG4iCisKKyM6IGFwbGF5L2FwbGF5LmM6NDczCittc2dpZCAiY29tbWFuZCBzaG91bGQgYmUgbmFtZWQgZWl0aGVyIGFyZWNvcmQgb3IgYXBsYXkiCittc2dzdHIgIkJlZmVobCBzb2xsdGUgYXJlY29yZCBvZGVyIGFwbGF5IHNlaW4iCisKKyM6IGFwbGF5L2FwbGF5LmM6NTEyCisjLCBjLWZvcm1hdAorbXNnaWQgInVucmVjb2duaXplZCBmaWxlIGZvcm1hdCAlcyIKK21zZ3N0ciAidW5iZWthbm50ZXMgRGF0ZWlmb3JtYXQgJXMiCisKKyM6IGFwbGF5L2FwbGF5LmM6NTE5CisjLCBjLWZvcm1hdAorbXNnaWQgInZhbHVlICVpIGZvciBjaGFubmVscyBpcyBpbnZhbGlkIgorbXNnc3RyICJLYW5hbGFuemFobCAlaSBpc3QgdW5nw7xsdGlnIgorCisjOiBhcGxheS9hcGxheS5jOjUzOAorIywgYy1mb3JtYXQKK21zZ2lkICJ3cm9uZyBleHRlbmRlZCBmb3JtYXQgJyVzJyIKK21zZ3N0ciAiZXJ3ZWl0ZXJ0ZXMgRm9ybWF0ICclcycgaXN0IHVuZ8O8bHRpZyIKKworIzogYXBsYXkvYXBsYXkuYzo1NDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiYmFkIHNwZWVkIHZhbHVlICVpIgorbXNnc3RyICJ1bmfDvGx0aWdlIFJhdGUgJWkiCisKKyM6IGFwbGF5L2FwbGF5LmM6NjQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIlRyeSBgJXMgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiIKK21zZ3N0ciAiU2llaGUgYCVzIC0taGVscCcgZsO8ciBtZWhyIEluZm9ybWF0aW9uZW4uXG4iCisKKyM6IGFwbGF5L2FwbGF5LmM6NjYwCisjLCBjLWZvcm1hdAorbXNnaWQgImF1ZGlvIG9wZW4gZXJyb3I6ICVzIgorbXNnc3RyICJGZWhsZXIgYmVpbSDDlmZmbmVuIGRlcyBHZXLDpHRlczogJXMiCisKKyM6IGFwbGF5L2FwbGF5LmM6NjY1CisjLCBjLWZvcm1hdAorbXNnaWQgImluZm8gZXJyb3I6ICVzIgorbXNnc3RyICJGZWhsZXIgYmVpbSBMZXNlbiBkZXIgR2Vyw6R0ZWluZm9ybWF0aW9uZW46ICVzIgorCisjOiBhcGxheS9hcGxheS5jOjY3MgorIywgYy1mb3JtYXQKK21zZ2lkICJub25ibG9jayBzZXR0aW5nIGVycm9yOiAlcyIKK21zZ3N0ciAiRmVobGVyIGJlaW0gU2V0emVuIGRlcyBub25ibG9jay1Nb2R1czogJXMiCisKKyM6IGFwbGF5L2FwbGF5LmM6NjgyIGFwbGF5L2FwbGF5LmM6ODA2IGFwbGF5L2FwbGF5LmM6MTE3NAorbXNnaWQgIm5vdCBlbm91Z2ggbWVtb3J5IgorbXNnc3RyICJuaWNodCBnZW51ZyBTcGVpY2hlciIKKworIzogYXBsYXkvYXBsYXkuYzo3MDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGNyZWF0ZSBwcm9jZXNzIElEIGZpbGUgJXM6ICVzIgorbXNnc3RyICJGZWhsZXIgYmVpbSBTY2hyZWliZW4gZGVyIFByb3plc3MtSUQtRGF0ZWkgJXM6ICVzIgorCisjOiBhcGxheS9hcGxheS5jOjc5NgorIywgYy1mb3JtYXQKK21zZ2lkICJyZWFkIGVycm9yIChjYWxsZWQgZnJvbSBsaW5lICVpKSIKK21zZ3N0ciAiTGVzZWZlaGxlciAoYXVmZ2VydWZlbiB2b24gWmVpbGUgJWkpIgorCisjOiBhcGxheS9hcGxheS5jOjg1NAorIywgYy1mb3JtYXQKK21zZ2lkICJ1bmtub3duIGxlbmd0aCBvZiAnZm10ICcgY2h1bmsgKHJlYWQgJXUsIHNob3VsZCBiZSAldSBhdCBsZWFzdCkiCittc2dzdHIgIiIKKyJ1bmJla2FubnRlIEzDpG5nZSBkZXMgJ2ZtdCAnLUJsb2NrcyAoZ2VsZXNlbjogJXUsIHNvbGx0ZSBtaW5kZXN0ZW5zICV1IHNlaW4pIgorCisjOiBhcGxheS9hcGxheS5jOjg2NAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisidW5rbm93biBsZW5ndGggb2YgZXh0ZW5zaWJsZSAnZm10ICcgY2h1bmsgKHJlYWQgJXUsIHNob3VsZCBiZSAldSBhdCBsZWFzdCkiCittc2dzdHIgIiIKKyJ1bmJla2FubnRlIEzDpG5nZSBkZXMgZXJ3ZWl0ZXJ0ZW4gJ2ZtdCAnLUJsb2NrcyAoZ2VsZXNlbjogJXUsIHNvbGx0ZSAiCisibWluZGVzdGVucyAldSBzZWluKSIKKworIzogYXBsYXkvYXBsYXkuYzo4NjkKK21zZ2lkICJ3cm9uZyBmb3JtYXQgdGFnIGluIGV4dGVuc2libGUgJ2ZtdCAnIGNodW5rIgorbXNnc3RyICJ1bmfDvGx0aWdlciBGb3JtYXQtV2VydCBpbSBlcndlaXRlcnRlbiAnZm10ICctQmxvY2siCisKKyM6IGFwbGF5L2FwbGF5LmM6ODc2CisjLCBjLWZvcm1hdAorbXNnaWQgImNhbid0IHBsYXkgV0FWRS1maWxlIGZvcm1hdCAweCUwNHggd2hpY2ggaXMgbm90IFBDTSBvciBGTE9BVCBlbmNvZGVkIgorbXNnc3RyICIiCisia2FubiBXQVZFLURhdGVpLUZvcm1hdCAweCUwNHggbmljaHQgYWJzcGllbGVuOyBpc3Qgd2VkZXIgUENNIG5vY2ggRkxPQVQiCisKKyM6IGFwbGF5L2FwbGF5LmM6ODgwCisjLCBjLWZvcm1hdAorbXNnaWQgImNhbid0IHBsYXkgV0FWRS1maWxlcyB3aXRoICVkIHRyYWNrcyIKK21zZ3N0ciAia2FubiBXQVZFLURhdGVpIG1pdCAlZCBLYW7DpGxlbiBuaWNodCBhYnNwaWVsZW4iCisKKyM6IGFwbGF5L2FwbGF5LmM6ODg4IGFwbGF5L2FwbGF5LmM6OTg4CisjLCBjLWZvcm1hdAorbXNnaWQgIldhcm5pbmc6IGZvcm1hdCBpcyBjaGFuZ2VkIHRvIFU4XG4iCittc2dzdHIgIldhcm51bmc6IGJlbnV0enRlcyBGb3JtYXQgaXN0IFU4XG4iCisKKyM6IGFwbGF5L2FwbGF5LmM6ODk0CisjLCBjLWZvcm1hdAorbXNnaWQgIldhcm5pbmc6IGZvcm1hdCBpcyBjaGFuZ2VkIHRvIFMxNl9MRVxuIgorbXNnc3RyICJXYXJudW5nOiBiZW51dHp0ZXMgRm9ybWF0IGlzdCBTMTZfTEVcbiIKKworIzogYXBsYXkvYXBsYXkuYzo5MDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiV2FybmluZzogZm9ybWF0IGlzIGNoYW5nZWQgdG8gUzI0XzNMRVxuIgorbXNnc3RyICJXYXJudW5nOiBiZW51dHp0ZXMgRm9ybWF0IGlzdCBTMjRfM0xFXG4iCisKKyM6IGFwbGF5L2FwbGF5LmM6OTA4CisjLCBjLWZvcm1hdAorbXNnaWQgIldhcm5pbmc6IGZvcm1hdCBpcyBjaGFuZ2VkIHRvIFMyNF9MRVxuIgorbXNnc3RyICJXYXJudW5nOiBiZW51dHp0ZXMgRm9ybWF0IGlzdCBTMjRfTEVcbiIKKworIzogYXBsYXkvYXBsYXkuYzo5MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiBjYW4ndCBwbGF5IFdBVkUtZmlsZXMgd2l0aCBzYW1wbGUgJWQgYml0cyBpbiAlZCBieXRlcyB3aWRlICglZCBjaGFubmVscykiCittc2dzdHIgIiIKKyJrYW5uIFdBVkUtRGF0ZWkgbWl0ICVkLUJpdC1TYW1wbGVzIGluICVkIEJ5dGVzICglZCBLYW7DpGxlKSBuaWNodCBhYnNwaWVsZW4iCisKKyM6IGFwbGF5L2FwbGF5LmM6OTI0CisjLCBjLWZvcm1hdAorbXNnaWQgIiBjYW4ndCBwbGF5IFdBVkUtZmlsZXMgd2l0aCBzYW1wbGUgJWQgYml0cyB3aWRlIgorbXNnc3RyICJrYW5uIFdBVkUtRGF0ZWkgbWl0ICVkLUJpdC1TYW1wbGVzIG5pY2h0IGFic3BpZWxlbiIKKworIzogYXBsYXkvYXBsYXkuYzo5ODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiV2FybmluZzogZm9ybWF0IGlzIGNoYW5nZWQgdG8gTVVfTEFXXG4iCittc2dzdHIgIldhcm51bmc6IGJlbnV0enRlcyBGb3JtYXQgaXN0IE1VX0xBV1xuIgorCisjOiBhcGxheS9hcGxheS5jOjk5NAorIywgYy1mb3JtYXQKK21zZ2lkICJXYXJuaW5nOiBmb3JtYXQgaXMgY2hhbmdlZCB0byBTMTZfQkVcbiIKK21zZ3N0ciAiV2FybnVuZzogYmVudXR6dGVzIEZvcm1hdCBpc3QgUzE2X0JFXG4iCisKKyM6IGFwbGF5L2FwbGF5LmM6MTAwNyBhcGxheS9hcGxheS5jOjE5MjUgYXBsYXkvYXBsYXkuYzoxOTMyIGFwbGF5L2FwbGF5LmM6MjQ1NQorIzogYXBsYXkvYXBsYXkuYzoyNDY3Cittc2dpZCAicmVhZCBlcnJvciIKK21zZ3N0ciAiTGVzZWZlaGxlciIKKworIzogYXBsYXkvYXBsYXkuYzoxMDM3Cittc2dpZCAiQnJva2VuIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgUENNOiBubyBjb25maWd1cmF0aW9ucyBhdmFpbGFibGUiCittc2dzdHIgIiIKKyJ1bmfDvGx0aWdlIEtvbmZpZ3VyYXRpb24gZsO8ciBkaWVzZXMgR2Vyw6R0OiBrZWluZSB1bnRlcnN0w7x0enRlIEtvbmZpZ3VyYXRpb24iCisKKyM6IGFwbGF5L2FwbGF5LmM6MTA1NAorbXNnaWQgIkFjY2VzcyB0eXBlIG5vdCBhdmFpbGFibGUiCittc2dzdHIgIlp1Z3JpZmZzLU1vZHVzIG5pY2h0IHVudGVyc3TDvHR6dCIKKworIzogYXBsYXkvYXBsYXkuYzoxMDU5Cittc2dpZCAiU2FtcGxlIGZvcm1hdCBub24gYXZhaWxhYmxlIgorbXNnc3RyICJTYW1wbGUtRm9ybWF0IG5pY2h0IHVudGVyc3TDvHR6dCIKKworIzogYXBsYXkvYXBsYXkuYzoxMDY1Cittc2dpZCAiQ2hhbm5lbHMgY291bnQgbm9uIGF2YWlsYWJsZSIKK21zZ3N0ciAiS2FuYWxhbnphaGwgbmljaHQgdW50ZXJzdMO8dHp0IgorCisjOiBhcGxheS9hcGxheS5jOjEwODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiV2FybmluZzogcmF0ZSBpcyBub3QgYWNjdXJhdGUgKHJlcXVlc3RlZCA9ICVpSHosIGdvdCA9ICVpSHopXG4iCittc2dzdHIgIiIKKyJXYXJudW5nOiBSYXRlIGlzdCBuaWNodCBleGFrdCAoYW5nZWZvcmRlcnQ6ICVpIEh6LCB1bnRlcnN0w7x0enQ6ICVpIEh6KVxuIgorCisjOiBhcGxheS9hcGxheS5jOjEwODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgICAgICAgcGxlYXNlLCB0cnkgdGhlIHBsdWcgcGx1Z2luICVzXG4iCittc2dzdHIgIiAgICAgICAgIHByb2JpZXJlbiBTaWUgYml0dGUgZGFzIHBsdWctUGx1Z2luOiAlc1xuIgorCisjOiBhcGxheS9hcGxheS5jOjExMjMKK21zZ2lkICJVbmFibGUgdG8gaW5zdGFsbCBodyBwYXJhbXM6IgorbXNnc3RyICJGZWhsZXIgYmVpbSBTZXR6ZW4gZGVyIEhhcmR3YXJlLVBhcmFtZXRlcjoiCisKKyM6IGFwbGF5L2FwbGF5LmM6MTEzMAorIywgYy1mb3JtYXQKK21zZ2lkICJDYW4ndCB1c2UgcGVyaW9kIGVxdWFsIHRvIGJ1ZmZlciBzaXplICglbHUgPT0gJWx1KSIKK21zZ3N0ciAiUGVyaW9kZSBnbGVpY2ggZGVyIFB1ZmZlci1HcsO2w59lIHdpcmQgbmljaHQgdW50ZXJzdMO8dHp0ICglbHUgPT0gJWx1KSIKKworIzogYXBsYXkvYXBsYXkuYzoxMTYxCittc2dpZCAidW5hYmxlIHRvIGluc3RhbGwgc3cgcGFyYW1zOiIKK21zZ3N0ciAiRmVobGVyIGJlaW0gU2V0emVuIGRlciBTb2Z0d2FyZS1QYXJhbWV0ZXI6IgorCisjOiBhcGxheS9hcGxheS5jOjExOTIKKyMsIGMtZm9ybWF0Cittc2dpZCAic25kX3BjbV9tbWFwX2JlZ2luIHByb2JsZW06ICVzIgorbXNnc3RyICJGZWhsZXIgYmVpIHNuZF9wY21fbW1hcF9iZWdpbjogJXMiCisKKyM6IGFwbGF5L2FwbGF5LmM6MTIxNQorIywgYy1mb3JtYXQKK21zZ2lkICJzdGRpbiBPX05PTkJMT0NLIGZsYWcgc2V0dXAgZmFpbGVkXG4iCittc2dzdHIgIkZlaGxlciBiZWltIFNldHplbiB2b24gT19OT05CTE9DSyBpbiBzdGRpblxuIgorCisjOiBhcGxheS9hcGxheS5jOjEyMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiXHJQQVVTRSBjb21tYW5kIGlnbm9yZWQgKG5vIGh3IHN1cHBvcnQpXG4iCittc2dzdHIgIlxyUGF1c2UtS29tbWFuZG8gaWdub3JpZXJ0IChrZWluZSBIVy1VbnRlcnN0w7x0enVuZylcbiIKKworIzogYXBsYXkvYXBsYXkuYzoxMjQyCisjLCBjLWZvcm1hdAorbXNnaWQgInBhdXNlIHB1c2ggZXJyb3I6ICVzIgorbXNnc3RyICJGZWhsZXIgYmVpbSBQYXVzaWVyZW46ICVzIgorCisjOiBhcGxheS9hcGxheS5jOjEyNTEKKyMsIGMtZm9ybWF0Cittc2dpZCAicGF1c2UgcmVsZWFzZSBlcnJvcjogJXMiCittc2dzdHIgIkZlaGxlciBiZWltIEJlZW5kZW4gZGVyIFBhdXNlOiAlcyIKKworIzogYXBsYXkvYXBsYXkuYzoxMjY1CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJccj09PSBQQVVTRSA9PT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCittc2dzdHIgIiIKKyJccj09PSBQQVVTRSA9PT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCisKKyM6IGFwbGF5L2FwbGF5LmM6MTMwNworIywgYy1mb3JtYXQKK21zZ2lkICJzdGF0dXMgZXJyb3I6ICVzIgorbXNnc3RyICJTdGF0dXMtRmVobGVyOiAlcyIKKworIzogYXBsYXkvYXBsYXkuYzoxMzE3IGFwbGF5L2FwbGF5LmM6MTMyOAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyEhISAoYXQgbGVhc3QgJS4zZiBtcyBsb25nKVxuIgorbXNnc3RyICIlcyEhISAobWluZGVzdGVucyAlLjNmIG1zKVxuIgorCisjOiBhcGxheS9hcGxheS5jOjEzMTggYXBsYXkvYXBsYXkuYzoxMzIxIGFwbGF5L2FwbGF5LmM6MTMyOQorbXNnaWQgInVuZGVycnVuIgorbXNnc3RyICJVbnRlcmxhdWYiCisKKyM6IGFwbGF5L2FwbGF5LmM6MTMxOCBhcGxheS9hcGxheS5jOjEzMjkKK21zZ2lkICJvdmVycnVuIgorbXNnc3RyICLDnGJlcmxhdWYiCisKKyM6IGFwbGF5L2FwbGF5LmM6MTMzMworIywgYy1mb3JtYXQKK21zZ2lkICJTdGF0dXM6XG4iCittc2dzdHIgIlN0YXR1czpcbiIKKworIzogYXBsYXkvYXBsYXkuYzoxMzM3CisjLCBjLWZvcm1hdAorbXNnaWQgInhydW46IHByZXBhcmUgZXJyb3I6ICVzIgorbXNnc3RyICJVbnRlci0vw5xiZXJsYXVmOiBGZWhsZXIgYmVpbSBSZS1Jbml0aWFsaXNpZXJlbiBkZXMgR2Vyw6R0ZXM6ICVzIgorCisjOiBhcGxheS9hcGxheS5jOjEzNDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3RhdHVzKERSQUlOSU5HKTpcbiIKK21zZ3N0ciAiU3RhdHVzIChEUkFJTklORyk6XG4iCisKKyM6IGFwbGF5L2FwbGF5LmM6MTM0NworIywgYy1mb3JtYXQKK21zZ2lkICJjYXB0dXJlIHN0cmVhbSBmb3JtYXQgY2hhbmdlPyBhdHRlbXB0aW5nIHJlY292ZXIuLi5cbiIKK21zZ3N0ciAiRm9ybWF0LVdlY2hzZWwgZGVyIEF1Zm5haG1lLURhdGVuPyBWZXJzdWNoZSBXaWVkZXJoZXJzdGVsbHVuZyAuLi5cbiIKKworIzogYXBsYXkvYXBsYXkuYzoxMzQ5CisjLCBjLWZvcm1hdAorbXNnaWQgInhydW4oRFJBSU5JTkcpOiBwcmVwYXJlIGVycm9yOiAlcyIKK21zZ3N0ciAiWFJVTiAoRFJBSU5JTkcpOiBGZWhsZXIgYmVpbSBSZS1Jbml0aWFsaXNpZXJlbiBkZXMgR2Vyw6R0ZXM6ICVzIgorCisjOiBhcGxheS9hcGxheS5jOjEzNTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3RhdHVzKFIvVyk6XG4iCittc2dzdHIgIlN0YXR1cyAoUi9XKTpcbiIKKworIzogYXBsYXkvYXBsYXkuYzoxMzU5CisjLCBjLWZvcm1hdAorbXNnaWQgInJlYWQvd3JpdGUgZXJyb3IsIHN0YXRlID0gJXMiCittc2dzdHIgIkxlc2UtL1NjaHJlaWJmZWhsZXIsIFN0YXR1cyA9ICVzIgorCisjOiBhcGxheS9hcGxheS5jOjEzNjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3VzcGVuZGVkLiBUcnlpbmcgcmVzdW1lLiAiCittc2dzdHIgIlJ1aGV6dXN0YW5kLiBWZXJzdWNoZSwgYXVmenV3ZWNrZW4uICIKKworIzogYXBsYXkvYXBsYXkuYzoxMzc0CisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZC4gUmVzdGFydGluZyBzdHJlYW0uICIKK21zZ3N0ciAiRmVobGdlc2NobGFnZW4uIFJlLUluaXRpYWxpc2llcnVuZy4gIgorCisjOiBhcGxheS9hcGxheS5jOjEzNzYKKyMsIGMtZm9ybWF0Cittc2dpZCAic3VzcGVuZDogcHJlcGFyZSBlcnJvcjogJXMiCittc2dzdHIgIlJ1aGV6dXN0YW5kOiBGZWhsZXIgYmVpbSBSZS1Jbml0aWFsaXNpZXJlbjogJXMiCisKKyM6IGFwbGF5L2FwbGF5LmM6MTM4MQorIywgYy1mb3JtYXQKK21zZ2lkICJEb25lLlxuIgorbXNnc3RyICJGZXJ0aWcuXG4iCisKKyM6IGFwbGF5L2FwbGF5LmM6MTQwMworIywgYy1mb3JtYXQKK21zZ2lkICIgIWNsaXAgICIKK21zZ3N0ciAiICFjbGlwICAiCisKKyM6IGFwbGF5L2FwbGF5LmM6MTU1MAorIywgYy1mb3JtYXQKK21zZ2lkICJVbnN1cHBvcnRlZCBiaXQgc2l6ZSAlZC5cbiIKK21zZ3N0ciAiJWQtQml0LVNhbXBsZXMgd2VyZGVuIG5pY2h0IHVudGVyc3TDvHR6dC5cbiIKKworIzogYXBsYXkvYXBsYXkuYzoxNTg0CisjLCBjLWZvcm1hdAorbXNnaWQgIk1heCBwZWFrICglbGkgc2FtcGxlcyk6IDB4JTA4eCAiCittc2dzdHIgIkjDtmNoc3R3ZXJ0ICglbGkgU2FtcGxlcyk6IDB4JTA4eCAiCisKKyM6IGFwbGF5L2FwbGF5LmM6MTYxOAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiU3VzcGljaW91cyBidWZmZXIgcG9zaXRpb24gKCVsaSB0b3RhbCk6IGF2YWlsID0gJWxpLCBkZWxheSA9ICVsaSwgYnVmZmVyID0gJSIKKyJsaVxuIgorbXNnc3RyICIiCisidmVyZMOkY2h0aWdlIFB1ZmZlci1Qb3NpdGlvbiAodG90YWwgJWxpKTogYXZhaWwgPSAlbGksIGRlbGF5ID0gJWxpLCBidWZmZXIgPSAlIgorImxpXG4iCisKKyM6IGFwbGF5L2FwbGF5LmM6MTY4MgorIywgYy1mb3JtYXQKK21zZ2lkICJ3cml0ZSBlcnJvcjogJXMiCittc2dzdHIgIlNjaHJlaWJmZWhsZXI6ICVzIgorCisjOiBhcGxheS9hcGxheS5jOjE3MjkKKyMsIGMtZm9ybWF0Cittc2dpZCAid3JpdGV2IGVycm9yOiAlcyIKK21zZ3N0ciAiVmVrdG9yLVNjaHJlaWItRmVobGVyOiAlcyIKKworIzogYXBsYXkvYXBsYXkuYzoxNzczCisjLCBjLWZvcm1hdAorbXNnaWQgInJlYWQgZXJyb3I6ICVzIgorbXNnc3RyICJMZXNlZmVobGVyOiAlcyIKKworIzogYXBsYXkvYXBsYXkuYzoxODE3CisjLCBjLWZvcm1hdAorbXNnaWQgInJlYWR2IGVycm9yOiAlcyIKK21zZ3N0ciAiVmVrdG9yLUxlc2UtRmVobGVyOiAlcyIKKworIzogYXBsYXkvYXBsYXkuYzoxODY1Cittc2dpZCAiY2FuJ3QgYWxsb2NhdGUgYnVmZmVyIGZvciBzaWxlbmNlIgorbXNnc3RyICJuaWNodCBnZW51ZyBTcGVpY2hlciBmw7xyIFN0aWxsZS1CbG9jayIKKworIzogYXBsYXkvYXBsYXkuYzoxODc0IGFwbGF5L2FwbGF5LmM6MjEwMCBhcGxheS9hcGxheS5jOjIxMDUgYXBsYXkvYXBsYXkuYzoyMTUyCisjOiBhcGxheS9hcGxheS5jOjIxNjEgYXBsYXkvYXBsYXkuYzoyMTY4IGFwbGF5L2FwbGF5LmM6MjE3OCBhcGxheS9hcGxheS5jOjIxODQKKyM6IGFwbGF5L2FwbGF5LmM6MjI1NiBhcGxheS9hcGxheS5jOjIyODYgYXBsYXkvYXBsYXkuYzoyMzAwCittc2dpZCAid3JpdGUgZXJyb3IiCittc2dzdHIgIlNjaHJlaWJmZWhsZXIiCisKKyM6IGFwbGF5L2FwbGF5LmM6MTg4NworIywgYy1mb3JtYXQKK21zZ2lkICJ2b2NfcGNtX2ZsdXNoIC0gc2lsZW5jZSBlcnJvciIKK21zZ3N0ciAidm9jX3BjbV9mbHVzaCAtIEZlaGxlciBpbiBzZXRfc2lsZW5jZSIKKworIzogYXBsYXkvYXBsYXkuYzoxODkwCittc2dpZCAidm9jX3BjbV9mbHVzaCBlcnJvciIKK21zZ3N0ciAiU2NocmVpYmZlaGxlciIKKworIzogYXBsYXkvYXBsYXkuYzoxOTE2Cittc2dpZCAibWFsbG9jIGVycm9yIgorbXNnc3RyICJuaWNodCBnZW51ZyBTcGVpY2hlciIKKworIzogYXBsYXkvYXBsYXkuYzoxOTIwCisjLCBjLWZvcm1hdAorbXNnaWQgIlBsYXlpbmcgQ3JlYXRpdmUgTGFicyBDaGFubmVsIGZpbGUgJyVzJy4uLlxuIgorbXNnc3RyICJTcGllbGUgQ3JlYXRpdmUgTGFicyBDaGFubmVsLURhdGVpICclcycuLi5cbiIKKworIzogYXBsYXkvYXBsYXkuYzoxOTg4IGFwbGF5L2FwbGF5LmM6MjA4MAorbXNnaWQgImNhbid0IHBsYXkgcGFja2VkIC52b2MgZmlsZXMiCittc2dzdHIgImthbm4ga29tcHJpbWllcnRlIC52b2MtRGF0ZWllbiBuaWNodCBhYnNwaWVsZW4iCisKKyM6IGFwbGF5L2FwbGF5LmM6MjA0MAorIywgYy1mb3JtYXQKK21zZ2lkICJjYW4ndCBwbGF5IGxvb3BzOyAlcyBpc24ndCBzZWVrYWJsZVxuIgorbXNnc3RyICIiCisia2FubiBTY2hsZWlmZSBuaWNodCBhYnNwaWVsZW47IERhdGVpcG9zaXRpb24gaW4gJXMgaXN0IG5pY2h0IMOkbmRlcmJhclxuIgorCisjOiBhcGxheS9hcGxheS5jOjIwODkKKyMsIGMtZm9ybWF0Cittc2dpZCAidW5rbm93biBibG9ja3R5cGUgJWQuIHRlcm1pbmF0ZS4iCittc2dzdHIgIlVuYmVrYW5udGVyIEJsb2NrLVR5cCAlZC4gQWJicnVjaC4iCisKKyM6IGFwbGF5L2FwbGF5LmM6MjIyMAorIywgYy1mb3JtYXQKK21zZ2lkICJXYXZlIGRvZXNuJ3Qgc3VwcG9ydCAlcyBmb3JtYXQuLi4iCittc2dzdHIgIkZvcm1hdCAlcyB3aXJkIGluIFdBVkUgbmljaHQgdW50ZXJzdMO8dHp0IC4uLiIKKworIzogYXBsYXkvYXBsYXkuYzoyMjgwCisjLCBjLWZvcm1hdAorbXNnaWQgIlNwYXJjIEF1ZGlvIGRvZXNuJ3Qgc3VwcG9ydCAlcyBmb3JtYXQuLi4iCittc2dzdHIgIkZvcm1hdCAlcyB3aXJkIGluIFNwYXJjLUF1ZGlvIG5pY2h0IHVudGVyc3TDvHR6dCAuLi4iCisKKyM6IGFwbGF5L2FwbGF5LmM6MjM2MQorbXNnaWQgIlBsYXlpbmciCittc2dzdHIgIldpZWRlcmdhYmU6IgorCisjOiBhcGxheS9hcGxheS5jOjIzNjEKK21zZ2lkICJSZWNvcmRpbmciCittc2dzdHIgIkF1Zm5haG1lOiIKKworIzogYXBsYXkvYXBsYXkuYzoyMzY1CisjLCBjLWZvcm1hdAorbXNnaWQgIlJhdGUgJWQgSHosICIKK21zZ3N0ciAiUmF0ZTogJWQgSHosICIKKworIzogYXBsYXkvYXBsYXkuYzoyMzY3CisjLCBjLWZvcm1hdAorbXNnaWQgIk1vbm8iCittc2dzdHIgIm1vbm8iCisKKyM6IGFwbGF5L2FwbGF5LmM6MjM2OQorIywgYy1mb3JtYXQKK21zZ2lkICJTdGVyZW8iCittc2dzdHIgInN0ZXJlbyIKKworIzogYXBsYXkvYXBsYXkuYzoyMzcxCisjLCBjLWZvcm1hdAorbXNnaWQgIkNoYW5uZWxzICVpIgorbXNnc3RyICIlaSBLYW7DpGxlIgorCisjOiBhcGxheS9hcGxheS5jOjI4ODIgYXBsYXkvYXBsYXkuYzoyOTM1CisjLCBjLWZvcm1hdAorbXNnaWQgIllvdSBuZWVkIHRvIHNwZWNpZnkgJWQgZmlsZXMiCittc2dzdHIgIkVzIHdlcmRlbiAlZCBEYXRlaWVuIGJlbsO2dGlndC4iCisKKyM6IHNlcS9hY29ubmVjdC9hY29ubmVjdC5jOjQ5CisjLCBjLWZvcm1hdAorbXNnaWQgImFjb25uZWN0IC0gQUxTQSBzZXF1ZW5jZXIgY29ubmVjdGlvbiBtYW5hZ2VyXG4iCittc2dzdHIgImFjb25uZWN0IC0gQUxTQSBTZXF1ZW56ZXIgVmVyYmluZHVuZ3MtTWFuYWdlclxuIgorCisjOiBzZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzo1MAorIywgYy1mb3JtYXQKK21zZ2lkICJDb3B5cmlnaHQgKEMpIDE5OTktMjAwMCBUYWthc2hpIEl3YWlcbiIKK21zZ3N0ciAiQ29weXJpZ2h0IMKpIDE5OTktMjAwMCBUYWthc2hpIEl3YWlcbiIKKworIzogc2VxL2Fjb25uZWN0L2Fjb25uZWN0LmM6NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiVXNhZ2U6XG4iCittc2dzdHIgIlZlcndlbmR1bmc6XG4iCisKKyM6IHNlcS9hY29ubmVjdC9hY29ubmVjdC5jOjUyCisjLCBjLWZvcm1hdAorbXNnaWQgIiAqIENvbm5lY3Rpb24vZGlzY29ubmVjdGlvbiBiZXR3ZWVuIHR3byBwb3J0c1xuIgorbXNnc3RyICIgKiBWZXJiaW5kdW5nIHp3aXNjaGVuIHp3ZWkgUG9ydHMgaGVyc3RlbGxlbi90cmVubmVuXG4iCisKKyM6IHNlcS9hY29ubmVjdC9hY29ubmVjdC5jOjUzCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgIGFjb25uZWN0IFstb3B0aW9uc10gc2VuZGVyIHJlY2VpdmVyXG4iCittc2dzdHIgIiAgIGFjb25uZWN0IFtPcHRpb25lbl0gU2VuZGVyIEVtcGbDpG5nZXJcbiIKKworIzogc2VxL2Fjb25uZWN0L2Fjb25uZWN0LmM6NTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgICBzZW5kZXIsIHJlY2VpdmVyID0gY2xpZW50OnBvcnQgcGFpclxuIgorbXNnc3RyICIgICAgIFNlbmRlciwgRW1wZsOkbmdlciA9IENsaWVudDpQb3J0XG4iCisKKyM6IHNlcS9hY29ubmVjdC9hY29ubmVjdC5jOjU1CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICAgLWQsLS1kaXNjb25uZWN0ICAgICBkaXNjb25uZWN0XG4iCittc2dzdHIgIiAgICAgLWQsLS1kaXNjb25uZWN0ICAgICBWZXJiaW5kdW5nIHRyZW5uZW5cbiIKKworIzogc2VxL2Fjb25uZWN0L2Fjb25uZWN0LmM6NTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgICAtZSwtLWV4Y2x1c2l2ZSAgICAgIGV4Y2x1c2l2ZSBjb25uZWN0aW9uXG4iCittc2dzdHIgIiAgICAgLWUsLS1leGNsdXNpdmUgICAgICBleGtsdXNpdmUgVmVyYmluZHVuZ1xuIgorCisjOiBzZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzo1NworIywgYy1mb3JtYXQKK21zZ2lkICIgICAgIC1yLC0tcmVhbCAjICAgICAgICAgY29udmVydCByZWFsLXRpbWUtc3RhbXAgb24gcXVldWVcbiIKK21zZ3N0ciAiICAgICAtciwtLXJlYWwgIyAgICAgICAgIGJlbnV0emUgWmVpdHN0ZW1wZWwgZGVyIFF1ZXVlICNcbiIKKworIzogc2VxL2Fjb25uZWN0L2Fjb25uZWN0LmM6NTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgICAtdCwtLXRpY2sgIyAgICAgICAgIGNvbnZlcnQgdGljay10aW1lLXN0YW1wIG9uIHF1ZXVlXG4iCittc2dzdHIgIiAgICAgLXQsLS10aWNrICMgICAgICAgICBiZW51dHplIFRpY2stWmVpdHN0ZW1wZWwgZGVyIFF1ZXVlICNcbiIKKworIzogc2VxL2Fjb25uZWN0L2Fjb25uZWN0LmM6NTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiICogTGlzdCBjb25uZWN0ZWQgcG9ydHMgKG5vIHN1YnNjcmlwdGlvbiBhY3Rpb24pXG4iCittc2dzdHIgIiAqIFBvcnRzIHVuZCBWZXJiaW5kdW5nZW4gYXVmbGlzdGVuXG4iCisKKyM6IHNlcS9hY29ubmVjdC9hY29ubmVjdC5jOjYwCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgIGFjb25uZWN0IC1pfC1vIFstb3B0aW9uc11cbiIKK21zZ3N0ciAiICAgYWNvbm5lY3QgLWl8LW8gW09wdGlvbmVuXVxuIgorCisjOiBzZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzo2MQorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgIC1pLC0taW5wdXQgICAgICAgICAgbGlzdCBpbnB1dCAocmVhZGFibGUpIHBvcnRzXG4iCittc2dzdHIgIiAgICAgLWksLS1pbnB1dCAgICAgICAgICBFaW5nYWJlLVBvcnRzIChsZXNiYXIpIGF1Zmxpc3RlblxuIgorCisjOiBzZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzo2MgorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgIC1vLC0tb3V0cHV0ICAgICAgICAgbGlzdCBvdXRwdXQgKHdyaXRhYmxlKSBwb3J0c1xuIgorbXNnc3RyICIgICAgIC1vLC0tb3V0cHV0ICAgICAgICAgQXVzZ2FiZS1Qb3J0cyAoc2NocmVpYmJhcikgYXVmbGlzdGVuXG4iCisKKyM6IHNlcS9hY29ubmVjdC9hY29ubmVjdC5jOjYzCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICAgLWwsLS1saXN0ICAgICAgICAgICBsaXN0IGN1cnJlbnQgY29ubmVjdGlvbnMgb2YgZWFjaCBwb3J0XG4iCittc2dzdHIgIiAgICAgLWwsLS1saXN0ICAgICAgICAgICBWZXJiaW5kdW5nZW4gZGVyIFBvcnRzIGF1Zmxpc3RlblxuIgorCisjOiBzZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzo2NAorIywgYy1mb3JtYXQKK21zZ2lkICIgKiBSZW1vdmUgYWxsIGV4cG9ydGVkIGNvbm5lY3Rpb25zXG4iCittc2dzdHIgIiAqIGFsbGUgVmVyYmluZHVuZ2VuIHRyZW5uZW5cbiIKKworIzogc2VxL2Fjb25uZWN0L2Fjb25uZWN0LmM6NjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgICAteCwgLS1yZW1vdmVhbGxcbiIKK21zZ3N0ciAiICAgICAteCwtLXJlbW92ZWFsbFxuIgorCisjOiBzZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzoxMzIKK21zZ2lkICJDb25uZWN0aW5nIFRvIgorbXNnc3RyICJ2ZXJidW5kZW4genUiCisKKyM6IHNlcS9hY29ubmVjdC9hY29ubmVjdC5jOjEzMworbXNnaWQgIkNvbm5lY3RlZCBGcm9tIgorbXNnc3RyICJ2ZXJidW5kZW4gdm9uIgorCisjOiBzZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzoxNjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiY2xpZW50ICVkOiAnJXMnIFt0eXBlPSVzXVxuIgorbXNnc3RyICJDbGllbnQgJWQ6ICclcycgW1R5cD0lc11cbiIKKworIzogc2VxL2Fjb25uZWN0L2Fjb25uZWN0LmM6MTczCittc2dpZCAidXNlciIKK21zZ3N0ciAiVXNlciIKKworIzogc2VxL2Fjb25uZWN0L2Fjb25uZWN0LmM6MTczCittc2dpZCAia2VybmVsIgorbXNnc3RyICJLZXJuZWwiCisKKyM6IHNlcS9hY29ubmVjdC9hY29ubmVjdC5jOjMwNworIywgYy1mb3JtYXQKK21zZ2lkICJjYW4ndCBvcGVuIHNlcXVlbmNlclxuIgorbXNnc3RyICJGZWhsZXIgYmVpbSDDlmZmbmVuIGRlcyBTZXF1ZW56ZXJzXG4iCisKKyM6IHNlcS9hY29ubmVjdC9hY29ubmVjdC5jOjMzNQorIywgYy1mb3JtYXQKK21zZ2lkICJjYW4ndCBnZXQgY2xpZW50IGlkXG4iCittc2dzdHIgIkZlaGxlciBiZWltIExlc2VuIGRlciBDbGllbnQtSURcbiIKKworIzogc2VxL2Fjb25uZWN0L2Fjb25uZWN0LmM6MzQyCisjLCBjLWZvcm1hdAorbXNnaWQgImNhbid0IHNldCBjbGllbnQgaW5mb1xuIgorbXNnc3RyICJGZWhsZXIgYmVpbSBTZXR6ZW4gZGVzIENsaWVudC1OYW1lbnNcbiIKKworIzogc2VxL2Fjb25uZWN0L2Fjb25uZWN0LmM6MzQ5CisjLCBjLWZvcm1hdAorbXNnaWQgImludmFsaWQgc2VuZGVyIGFkZHJlc3MgJXNcbiIKK21zZ3N0ciAidW5nw7xsdGlnZSBTZW5kZXItQWRyZXNzZSAlc1xuIgorCisjOiBzZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzozNTQgc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjI5MAorIywgYy1mb3JtYXQKK21zZ2lkICJpbnZhbGlkIGRlc3RpbmF0aW9uIGFkZHJlc3MgJXNcbiIKK21zZ3N0ciAidW5nw7xsdGlnZSBaaWVsLUFkcmVzc2UgJXNcbiIKKworIzogc2VxL2Fjb25uZWN0L2Fjb25uZWN0LmM6MzY4CisjLCBjLWZvcm1hdAorbXNnaWQgIk5vIHN1YnNjcmlwdGlvbiBpcyBmb3VuZFxuIgorbXNnc3RyICJrZWluZSBWZXJiaW5kdW5nIGdlZnVuZGVuXG4iCisKKyM6IHNlcS9hY29ubmVjdC9hY29ubmVjdC5jOjM3MworIywgYy1mb3JtYXQKK21zZ2lkICJEaXNjb25uZWN0aW9uIGZhaWxlZCAoJXMpXG4iCittc2dzdHIgIlZlcmJpbmR1bmdzLVRyZW5udW5nIGZlaGxnZXNjaGxhZ2VuICglcylcbiIKKworIzogc2VxL2Fjb25uZWN0L2Fjb25uZWN0LmM6Mzc5CisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbm5lY3Rpb24gaXMgYWxyZWFkeSBzdWJzY3JpYmVkXG4iCittc2dzdHIgIlZlcmJpbmR1bmcgaXN0IGJlcmVpdHMgdm9yaGFuZGVuXG4iCisKKyM6IHNlcS9hY29ubmVjdC9hY29ubmVjdC5jOjM4NAorIywgYy1mb3JtYXQKK21zZ2lkICJDb25uZWN0aW9uIGZhaWxlZCAoJXMpXG4iCittc2dzdHIgIlZlcmJpbmR1bmcgZmVobGdlc2NobGFnZW4gKCVzKVxuIgorCisjOiBzZXEvYXNlcW5ldC9hc2VxbmV0LmM6MTY0CisjLCBjLWZvcm1hdAorbXNnaWQgImFzZXFuZXQgLSBuZXR3b3JrIGNsaWVudC9zZXJ2ZXIgb24gQUxTQSBzZXF1ZW5jZXJcbiIKK21zZ3N0ciAiYXNlcW5ldCAtIE5ldHp3ZXJrLUNsaWVudC9TZXJ2ZXIgZsO8ciBBTFNBIFNlcXVlbnplclxuIgorCisjOiBzZXEvYXNlcW5ldC9hc2VxbmV0LmM6MTY1CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgQ29weXJpZ2h0IChDKSAxOTk5IFRha2FzaGkgSXdhaVxuIgorbXNnc3RyICIgIENvcHlyaWdodCDCqSAxOTk5IFRha2FzaGkgSXdhaVxuIgorCisjOiBzZXEvYXNlcW5ldC9hc2VxbmV0LmM6MTY2CisjLCBjLWZvcm1hdAorbXNnaWQgInVzYWdlOlxuIgorbXNnc3RyICJWZXJ3ZW5kdW5nOlxuIgorCisjOiBzZXEvYXNlcW5ldC9hc2VxbmV0LmM6MTY3CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgc2VydmVyIG1vZGU6IGFzZXFuZXQgWy1vcHRpb25zXVxuIgorbXNnc3RyICIgIFNlcnZlci1Nb2R1czogYXNlcW5ldCBbT3B0aW9uZW5dXG4iCisKKyM6IHNlcS9hc2VxbmV0L2FzZXFuZXQuYzoxNjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBjbGllbnQgbW9kZTogYXNlcW5ldCBbLW9wdGlvbnNdIHNlcnZlcl9ob3N0XG4iCittc2dzdHIgIiAgQ2xpZW50LU1vZHVzOiBhc2VxbmV0IFtPcHRpb25lbl0gU2VydmVySG9zdFxuIgorCisjOiBzZXEvYXNlcW5ldC9hc2VxbmV0LmM6MTY5CisjLCBjLWZvcm1hdAorbXNnaWQgIm9wdGlvbnM6XG4iCittc2dzdHIgIk9wdGlvbmVuOlxuIgorCisjOiBzZXEvYXNlcW5ldC9hc2VxbmV0LmM6MTcwCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLXAsLS1wb3J0ICMgOiBzZXBjaWZ5IFRDUCBwb3J0IChkaWdpdCBvciBzZXJ2aWNlIG5hbWUpXG4iCittc2dzdHIgIiAgLXAsLS1wb3J0ICMgOiBUQ1AtUG9ydCAoWmFobCBvZGVyIFNlcnZpY2UtTmFtZSlcbiIKKworIzogc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjE3MQorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1zLC0tc291cmNlIGFkZHIgOiByZWFkIGZyb20gZ2l2ZW4gYWRkciAoY2xpZW50OnBvcnQpXG4iCittc2dzdHIgIiAgLXMsLS1zb3VyY2UgIyA6IGxlc2Ugdm9uIFNlcXVlbnplci1Qb3J0IChDbGllbnQ6UG9ydClcbiIKKworIzogc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjE3MgorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1kLC0tZGVzdCBhZGRyIDogd3JpdGUgdG8gZ2l2ZW4gYWRkciAoY2xpZW50OnBvcnQpXG4iCittc2dzdHIgIiAgLWQsLS1kZXN0ICMgOiBzY2hyZWliZSBhdWYgU2VxdWVuemVyLVBvcnQgKENsaWVudDpQb3J0KVxuIgorCisjOiBzZXEvYXNlcW5ldC9hc2VxbmV0LmM6MTczCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLXYsIC0tdmVyYm9zZSA6IHByaW50IHZlcmJvc2UgbWVzc2FnZXNcbiIKK21zZ3N0ciAiICAtdiwtLXZlcmJvc2UgOiBhdXNmw7xocmxpY2hlIE1lbGR1bmdlblxuIgorCisjOiBzZXEvYXNlcW5ldC9hc2VxbmV0LmM6MTc0CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLWksIC0taW5mbyA6IHByaW50IGNlcnRhaW4gcmVjZWl2ZWQgZXZlbnRzXG4iCittc2dzdHIgIiAgLWksLS1pbmZvIDogQXVzZ2FiZSBiZXN0aW1tdGVyIGVtcGZhbmdlbmVyIEVyZWlnbmlzc2VcbiIKKworIzogc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjE4OAorIywgYy1mb3JtYXQKK21zZ2lkICJjYW4ndCBtYWxsb2NcbiIKK21zZ3N0ciAibmljaHQgZ2VudWcgU3BlaWNoZXJcbiIKKworIzogc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjIxMworIywgYy1mb3JtYXQKK21zZ2lkICJjbG9zaW5nIGZpbGVzLi5cbiIKK21zZ3N0ciAic2NobGllw59lIERhdGVpZW4gLi4uXG4iCisKKyM6IHNlcS9hc2VxbmV0L2FzZXFuZXQuYzoyNzIKKyMsIGMtZm9ybWF0Cittc2dpZCAic2VxdWVuY2VyIG9wZW5lZDogJWQ6JWRcbiIKK21zZ3N0ciAiU2VxdWVuemVyIGdlw7ZmZm5ldDogJWQ6JWRcbiIKKworIzogc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjI3OQorIywgYy1mb3JtYXQKK21zZ2lkICJpbnZhbGlkIHNvdXJjZSBhZGRyZXNzICVzXG4iCittc2dzdHIgInVuZ8O8bHRpZ2UgUXVlbGwtQWRyZXNzZSAlc1xuIgorCisjOiBzZXEvYXNlcW5ldC9hc2VxbmV0LmM6MzA5CisjLCBjLWZvcm1hdAorbXNnaWQgInNlcnZpY2UgJyVzJyBpcyBub3QgZm91bmQgaW4gL2V0Yy9zZXJ2aWNlc1xuIgorbXNnc3RyICJTZXJ2aWNlICclcycgaW4gL2V0Yy9zZXJ2aWNlcyBuaWNodCBnZWZ1bmRlblxuIgorCisjOiBzZXEvYXNlcW5ldC9hc2VxbmV0LmM6Mzc3CisjLCBjLWZvcm1hdAorbXNnaWQgInRvbyBtYW55IGNvbm5lY3Rpb25zIVxuIgorbXNnc3RyICJ6dSB2aWVsZSBWZXJiaW5kdW5nZW5cbiIKKworIzogc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjM4OAorIywgYy1mb3JtYXQKK21zZ2lkICJhY2NlcHRlZFslZF1cbiIKK21zZ3N0ciAiYW5nZW5vbW1lblslZF1cbiIKKworIzogc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjQxMQorIywgYy1mb3JtYXQKK21zZ2lkICJjYW4ndCBnZXQgYWRkcmVzcyAlc1xuIgorbXNnc3RyICJrYW5uIEFkcmVzc2UgZsO8ciAlcyBuaWNodCBiZXN0aW1tZW5cbiIKKworIzogc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjQyMgorIywgYy1mb3JtYXQKK21zZ2lkICJvay4uIGNvbm5lY3RlZFxuIgorbXNnc3RyICJPSyAuLi4gdmVyYnVuZGVuXG4iCisKKyM6IHNlcS9hc2VxbmV0L2FzZXFuZXQuYzo1MTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2hhbm5lbCAlMmQ6IENvbnRyb2wgZXZlbnQgOiAlNWRcbiIKK21zZ3N0ciAiQ2hhbm5lbCAlMmQ6IENvbnRyb2wgZXZlbnQgOiAlNWRcbiIKKworIzogc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjUyMgorIywgYy1mb3JtYXQKK21zZ2lkICJDaGFubmVsICUyZDogUGl0Y2hiZW5kZXIgICA6ICU1ZFxuIgorbXNnc3RyICJDaGFubmVsICUyZDogUGl0Y2hiZW5kZXIgICA6ICU1ZFxuIgorCisjOiBzZXEvYXNlcW5ldC9hc2VxbmV0LmM6NTI2CisjLCBjLWZvcm1hdAorbXNnaWQgIkNoYW5uZWwgJTJkOiBOb3RlIE9uIGV2ZW50IDogJTVkXG4iCittc2dzdHIgIkNoYW5uZWwgJTJkOiBOb3RlIE9uIGV2ZW5ldCA6ICU1ZFxuIgorCisjOiBzZXEvYXNlcW5ldC9hc2VxbmV0LmM6NTMwCisjLCBjLWZvcm1hdAorbXNnaWQgIkNoYW5uZWwgJTJkOiBOb3RlIE9mZiBldmVudDogJTVkXG4iCittc2dzdHIgIkNoYW5uZWwgJTJkOiBOb3RlIE9mZiBldmVudDogJTVkXG4iCisKKyM6IHNlcS9hc2VxbmV0L2FzZXFuZXQuYzo1ODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiZGlzY29ubmVjdGVkXG4iCittc2dzdHIgIlZlcmJpbmR1bmcgZ2V0cmVubnRcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjEwNAorbXNnaWQgIkZyb250IExlZnQiCittc2dzdHIgIlZvcm5lIGxpbmtzIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6MTA1Cittc2dpZCAiRnJvbnQgUmlnaHQiCittc2dzdHIgIlZvcm5lIHJlY2h0cyIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjEwNgorbXNnaWQgIlJlYXIgTGVmdCIKK21zZ3N0ciAiSGludGVuIGxpbmtzIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6MTA3Cittc2dpZCAiUmVhciBSaWdodCIKK21zZ3N0ciAiSGludGVuIHJlY2h0cyIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjEwOQorbXNnaWQgIkxGRSIKK21zZ3N0ciAiQmFzcyIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjExMAorbXNnaWQgIlNpZGUgTGVmdCIKK21zZ3N0ciAiU2VpdGxpY2ggbGlua3MiCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzoxMTEKK21zZ2lkICJTaWRlIFJpZ2h0IgorbXNnc3RyICJTZWl0bGljaCByZWNodHMiCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzoxMTIKK21zZ2lkICJDaGFubmVsIDkiCittc2dzdHIgIkthbmFsIDkiCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzoxMTMKK21zZ2lkICJDaGFubmVsIDEwIgorbXNnc3RyICJLYW5hbCAxMCIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjExNAorbXNnaWQgIkNoYW5uZWwgMTEiCittc2dzdHIgIkthbmFsIDExIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6MTE1Cittc2dpZCAiQ2hhbm5lbCAxMiIKK21zZ3N0ciAiS2FuYWwgMTIiCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzoxMTYKK21zZ2lkICJDaGFubmVsIDEzIgorbXNnc3RyICJLYW5hbCAxMyIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjExNworbXNnaWQgIkNoYW5uZWwgMTQiCittc2dzdHIgIkthbmFsIDE0IgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6MTE4Cittc2dpZCAiQ2hhbm5lbCAxNSIKK21zZ3N0ciAiS2FuYWwgMTUiCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzoxMTkKK21zZ2lkICJDaGFubmVsIDE2IgorbXNnc3RyICJLYW5hbCAxNiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjM4MworIywgYy1mb3JtYXQKK21zZ2lkICJCcm9rZW4gY29uZmlndXJhdGlvbiBmb3IgcGxheWJhY2s6IG5vIGNvbmZpZ3VyYXRpb25zIGF2YWlsYWJsZTogJXNcbiIKK21zZ3N0ciAiVW5nw7xsdGlnZSBLb25maWd1cmF0aW9uOiBrZWluZSB1bnRlcnN0w7x0enRlIEtvbmZpZ3VyYXRpb246ICVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzozOTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiQWNjZXNzIHR5cGUgbm90IGF2YWlsYWJsZSBmb3IgcGxheWJhY2s6ICVzXG4iCittc2dzdHIgIlp1Z3JpZmZzbW9kdXMgbmljaHQgdW50ZXJzdMO8dHp0OiAlc1xuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6Mzk3CisjLCBjLWZvcm1hdAorbXNnaWQgIlNhbXBsZSBmb3JtYXQgbm90IGF2YWlsYWJsZSBmb3IgcGxheWJhY2s6ICVzXG4iCittc2dzdHIgIlNhbXBsZS1Gb3JtYXQgbmljaHQgdW50ZXJzdMO8dHp0OiAlc1xuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6NDA0CisjLCBjLWZvcm1hdAorbXNnaWQgIkNoYW5uZWxzIGNvdW50ICglaSkgbm90IGF2YWlsYWJsZSBmb3IgcGxheWJhY2tzOiAlc1xuIgorbXNnc3RyICJLYW5hbC1BbnphaGwgJWkgbmljaHQgdW50ZXJzdMO8dHp0OiAlc1xuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6NDEyCisjLCBjLWZvcm1hdAorbXNnaWQgIlJhdGUgJWlIeiBub3QgYXZhaWxhYmxlIGZvciBwbGF5YmFjazogJXNcbiIKK21zZ3N0ciAiUmF0ZSAlaSBIeiBuaWNodCB1bnRlcnN0w7x0enQ6ICVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo0MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmF0ZSBkb2Vzbid0IG1hdGNoIChyZXF1ZXN0ZWQgJWlIeiwgZ2V0ICVpSHosIGVyciAlZClcbiIKK21zZ3N0ciAiIgorIlJhdGUgaXN0IG5pY2h0IGV4YWt0IChhbmdlZm9yZGVydDogJWkgSHosIHVudGVyc3TDvHR6dDogJWkgSHosIEZlaGxlcmNvZGUgJSIKKyJkKVxuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6NDIxCisjLCBjLWZvcm1hdAorbXNnaWQgIlJhdGUgc2V0IHRvICVpSHogKHJlcXVlc3RlZCAlaUh6KVxuIgorbXNnc3RyICJSYXRlIGlzdCAlaSBIeiAoYW5nZWZvcmRlcnQ6ICVpIEh6KVxuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6NDI3CisjLCBjLWZvcm1hdAorbXNnaWQgIkJ1ZmZlciBzaXplIHJhbmdlIGZyb20gJWx1IHRvICVsdVxuIgorbXNnc3RyICJQdWZmZXJncsO2w59lIHZvbiAlbHUgYmlzICVsdVxuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6NDI4CisjLCBjLWZvcm1hdAorbXNnaWQgIlBlcmlvZCBzaXplIHJhbmdlIGZyb20gJWx1IHRvICVsdVxuIgorbXNnc3RyICJQZXJpb2Rlbmdyw7bDn2Ugdm9uICVsdSBiaXMgJWx1XG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo0MzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVxdWVzdGVkIHBlcmlvZCB0aW1lICV1IHVzXG4iCittc2dzdHIgIkFuZ2Vmb3JkZXJ0ZSBQZXJpb2RlbnplaXQgJXUgwrVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo0MzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIHNldCBwZXJpb2QgdGltZSAldSB1cyBmb3IgcGxheWJhY2s6ICVzXG4iCittc2dzdHIgIkZlaGxlciBiZWltIFNldHplbiBkZXIgUGVyaW9kZW56ZWl0ICV1IMK1czogJXNcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjQzOQorIywgYy1mb3JtYXQKK21zZ2lkICJSZXF1ZXN0ZWQgYnVmZmVyIHRpbWUgJXUgdXNcbiIKK21zZ3N0ciAiQW5nZWZvcmRlcnRlIFB1ZmZlcmzDpG5nZSAldSDCtXNcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjQ0MgorIywgYy1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gc2V0IGJ1ZmZlciB0aW1lICV1IHVzIGZvciBwbGF5YmFjazogJXNcbiIKK21zZ3N0ciAiRmVobGVyIGJlaW0gU2V0emVuIGRlciBQdWZmZXJsw6RuZ2UgJXUgwrVzOiAlc1xuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6NDUxCisjLCBjLWZvcm1hdAorbXNnaWQgIlVzaW5nIG1heCBidWZmZXIgc2l6ZSAlbHVcbiIKK21zZ3N0ciAiVmVyd2VuZGUgbWF4aW1hbGUgUHVmZmVyZ3LDtsOfZSAlbHVcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjQ1NAorIywgYy1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gc2V0IGJ1ZmZlciBzaXplICVsdSBmb3IgcGxheWJhY2s6ICVzXG4iCittc2dzdHIgIkZlaGxlciBiZWltIFNldHplbiBkZXIgUHVmZmVyZ3LDtsOfZSAlbHU6ICVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo0NjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGVyaW9kcyA9ICV1XG4iCittc2dzdHIgIlBlcmlvZGVuID0gJXVcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjQ2MworIywgYy1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gc2V0IG5wZXJpb2RzICV1IGZvciBwbGF5YmFjazogJXNcbiIKK21zZ3N0ciAiRmVobGVyIGJlaW0gU2V0emVuIGRlciBQZXJpb2RlbmFuemFobCAldTogJXNcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjQ3MgorIywgYy1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gc2V0IGh3IHBhcmFtcyBmb3IgcGxheWJhY2s6ICVzXG4iCittc2dzdHIgIkZlaGxlciBiZWltIFNldHplbiBkZXIgSGFyZHdhcmUtUGFyYW1ldGVyOiAlc1xuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6NDc4CisjLCBjLWZvcm1hdAorbXNnaWQgIndhcyBzZXQgcGVyaW9kX3NpemUgPSAlbHVcbiIKK21zZ3N0ciAiZ2VzZXR6dDogcGVyaW9kX3NpemUgPSAlbHVcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjQ3OQorIywgYy1mb3JtYXQKK21zZ2lkICJ3YXMgc2V0IGJ1ZmZlcl9zaXplID0gJWx1XG4iCittc2dzdHIgImdlc2V0enQ6IGJ1ZmZlcl9zaXplID0gJWx1XG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo0ODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiYnVmZmVyIHRvIHNtYWxsLCBjb3VsZCBub3QgdXNlXG4iCittc2dzdHIgIlB1ZmZlciB6dSBrbGVpbiwga2FubiBuaWNodCBiZW51dHp0IHdlcmRlblxuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6NDk0CisjLCBjLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byBkZXRlcm1pbmUgY3VycmVudCBzd3BhcmFtcyBmb3IgcGxheWJhY2s6ICVzXG4iCittc2dzdHIgIkZlaGxlciBiZWltIExlc2VuIGRlciBTb2Z0d2FyZS1QYXJhbWV0ZXI6ICVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo1MDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIHNldCBzdGFydCB0aHJlc2hvbGQgbW9kZSBmb3IgcGxheWJhY2s6ICVzXG4iCittc2dzdHIgIkZlaGxlciBiZWltIFNldHplbiBkZXMgU3RhcnQtU2Nod2VsbGVud2VydGVzOiAlc1xuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6NTA4CisjLCBjLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byBzZXQgYXZhaWwgbWluIGZvciBwbGF5YmFjazogJXNcbiIKK21zZ3N0ciAiRmVobGVyIGJlaW0gU2V0emVuIGRlcyBNaW5kZXN0LXZlcmbDvGdiYXItV2VydGVzOiAlc1xuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6NTE1CisjLCBjLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byBzZXQgc3cgcGFyYW1zIGZvciBwbGF5YmFjazogJXNcbiIKK21zZ3N0ciAiRmVobGVyIGJlaW0gU2V0emVuIGRlciBTb2Z0d2FyZS1QYXJhbWV0ZXI6ICVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo1MzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3QgcmVjb3ZlcnkgZnJvbSB1bmRlcnJ1biwgcHJlcGFyZSBmYWlsZWQ6ICVzXG4iCittc2dzdHIgIiIKKyJGZWhsZXIgYmVpIFVudGVybGF1Zi1CZWhhbmRsdW5nLCBSZS1Jbml0aWFsaXNpZXJ1bmcgZmVobGdlc2NobGFnZW46ICVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo1NDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3QgcmVjb3ZlcnkgZnJvbSBzdXNwZW5kLCBwcmVwYXJlIGZhaWxlZDogJXNcbiIKK21zZ3N0ciAiIgorIkZlaGxlciBiZWltIEF1ZndhY2hlbiBhdXMgZGVtIFJ1aGV6dXN0YW5kLCBSZS1Jbml0aWFsaXNpZXJ1bmcgIgorImZlaGxnZXNjaGxhZ2VuOiAlc1xuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6NjA1IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzoxMDI1CisjLCBjLWZvcm1hdAorbXNnaWQgIk5vIGVub3VnaCBtZW1vcnlcbiIKK21zZ3N0ciAiTmljaHQgZ2VudWcgU3BlaWNoZXJcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjYxMAorIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3Qgb3BlbiBXQVYgZmlsZSAlc1xuIgorbXNnc3RyICJLYW5uIFdBVi1EYXRlaSAlcyBuaWNodCDDtmZmbmVuXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo2MTQgc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjY0MworIywgYy1mb3JtYXQKK21zZ2lkICJJbnZhbGlkIFdBViBmaWxlICVzXG4iCittc2dzdHIgIlVuZ8O8bHRpZ2UgV0FWLURhdGVpICVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo2MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiTm90IGEgV0FWIGZpbGU6ICVzXG4iCittc2dzdHIgIktlaW5lIFdBVi1EYXRlaTogJXNcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjYyMworIywgYy1mb3JtYXQKK21zZ2lkICJVbnN1cHBvcnRlZCBXQVYgZm9ybWF0ICVkIGZvciAlc1xuIgorbXNnc3RyICJOaWNodCB1bnRlcnN0w7x0enRlcyBXQVYtRm9ybWF0ICVkIGluICVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo2MjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgaXMgbm90IGEgbW9ubyBzdHJlYW0gKCVkIGNoYW5uZWxzKVxuIgorbXNnc3RyICIlcyBpc3Qga2VpbmUgTW9uby1EYXRlaSAoJWQgS2Fuw6RsZSlcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjYzMworIywgYy1mb3JtYXQKK21zZ2lkICJTYW1wbGUgcmF0ZSBkb2Vzbid0IG1hdGNoICglZCkgZm9yICVzXG4iCittc2dzdHIgIlNhbXBsZS1SYXRlICglZCkgc3RpbW10IG5pY2h0IMO8YmVyZWluIGluICVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo2MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5zdXBwb3J0ZWQgc2FtcGxlIGZvcm1hdCBiaXRzICVkIGZvciAlc1xuIgorbXNnc3RyICJOaWNodCB1bnRlcnN0w7x0enRlcyBTYW1wbGUtRm9ybWF0IG1pdCAlZCBCaXRzIGluICVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo2ODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5kZWZpbmVkIGNoYW5uZWwgJWRcbiIKK21zZ3N0ciAiS2FuYWwgJWQgbmljaHQgZGVmaW5pZXJ0XG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo3MzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiV3JpdGUgZXJyb3I6ICVkLCVzXG4iCittc2dzdHIgIlNjaHJlaWJmZWhsZXI6ICVkLCAlc1xuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6NzQxCisjLCBjLWZvcm1hdAorbXNnaWQgInhydW5fcmVjb3ZlcnkgZmFpbGVkOiAlZCwlc1xuIgorbXNnc3RyICJ4cnVuX3JlY292ZXJ5IGZlaGxnZXNjaGxhZ2VuOiAlZCwgJXNcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjgwMworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiVXNhZ2U6IHNwZWFrZXItdGVzdCBbT1BUSU9OXS4uLiBcbiIKKyItaCwtLWhlbHBcdGhlbHBcbiIKKyItRCwtLWRldmljZVx0cGxheWJhY2sgZGV2aWNlXG4iCisiLXIsLS1yYXRlXHRzdHJlYW0gcmF0ZSBpbiBIelxuIgorIi1jLC0tY2hhbm5lbHNcdGNvdW50IG9mIGNoYW5uZWxzIGluIHN0cmVhbVxuIgorIi1mLC0tZnJlcXVlbmN5XHRzaW5lIHdhdmUgZnJlcXVlbmN5IGluIEh6XG4iCisiLUYsLS1mb3JtYXRcdHNhbXBsZSBmb3JtYXRcbiIKKyItYiwtLWJ1ZmZlclx0cmluZyBidWZmZXIgc2l6ZSBpbiB1c1xuIgorIi1wLC0tcGVyaW9kXHRwZXJpb2Qgc2l6ZSBpbiB1c1xuIgorIi1QLC0tbnBlcmlvZHNcdG51bWJlciBvZiBwZXJpb2RzXG4iCisiLXQsLS10ZXN0XHRwaW5rPXVzZSBwaW5rIG5vaXNlLCBzaW5lPXVzZSBzaW5lIHdhdmUsIHdhdj1XQVYgZmlsZVxuIgorIi1sLC0tbmxvb3BzXHRzcGVjaWZ5IG51bWJlciBvZiBsb29wcyB0byB0ZXN0LCAwID0gaW5maW5pdGVcbiIKKyItcywtLXNwZWFrZXJcdHNpbmdsZSBzcGVha2VyIHRlc3QuIFZhbHVlcyAxPUxlZnQsIDI9cmlnaHQsIGV0Y1xuIgorIi13LC0td2F2ZmlsZVx0VXNlIHRoZSBnaXZlbiBXQVYgZmlsZSBhcyBhIHRlc3Qgc291bmRcbiIKKyItVywtLXdhdmRpclx0U3BlY2lmeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgV0FWIGZpbGVzXG4iCisiXG4iCittc2dzdHIgIiIKKyJWZXJ3ZW5kdW5nOiBzcGVha2VyLXRlc3QgW09wdGlvbl0uLi5cbiIKKyItaCwtLWhlbHAgICAgICAgSGlsZmVcbiIKKyItRCwtLWRldmljZSAgICAgV2llZGVyZ2FiZS1HZXLDpHRcbiIKKyItciwtLXJhdGUgICAgICAgU2FtcGxlLVJhdGUgaW4gSHpcbiIKKyItYywtLWNoYW5uZWxzICAgQW56YWhsIGRlciBLYW7DpGxlXG4iCisiLWYsLS1mcmVxdWVuY3kgIEZyZXF1ZW56IGRlciBTaW51c3dlbGxlIGluIEh6XG4iCisiLUYsLS1mb3JtYXQgICAgIFNhbXBsZS1Gb3JtYXRcbiIKKyItYiwtLWJ1ZmZlciAgICAgUmluZ3B1ZmZlcmzDpG5nZSBpbiDCtXNcbiIKKyItcCwtLXBlcmlvZCAgICAgUGVyaW9kZW5sw6RuZ2UgaW4gwrVzXG4iCisiLVAsLS1ucGVyaW9kcyAgIEFuemFobCBkZXIgUGVyaW9kZW5cbiIKKyItdCwtLXRlc3QgICAgICAgcGluaz1yb3NhIFJhdXNjaGVuLCBzaW5lPVNpbnVzd2VsbGUsIHdhdj1XQVYtRGF0ZWlcbiIKKyItbCwtLW5sb29wcyAgICAgQW56YWhsIGRlciBXaWVkZXJob2x1bmdlbiwgMCA9IHVuZW5kbGljaFxuIgorIi1zLC0tc3BlYWtlciAgICB0ZXN0ZSBlaW5lbiBlaW56ZWxuZW4gTGF1dHNwcmVjaGVyOyAxPWxpbmtzLCAyPXJlY2h0cywgdXN3LlxuIgorIi13LC0td2F2ZmlsZSAgICBiZW51dHplIFdBVi1EYXRlaSBhbHMgVGVzdHRvblxuIgorIi1XLC0td2F2ZGlyICAgICBiZW51dHplIFZlcnplaWNobmlzIG1pdCBkYXJpbiBlbnRoYWx0ZW5lbiBXQVYtRGF0ZWllblxuIgorIlxuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6OTIxCisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgbnVtYmVyIG9mIHBlcmlvZHMgJWRcbiIKK21zZ3N0ciAiVW5nw7xsdGlnZSBQZXJpb2RlbmFuemFobCAlZFxuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6OTM3IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo5NDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW52YWxpZCB0ZXN0IHR5cGUgJXNcbiIKK21zZ3N0ciAiVW5nw7xsdGlnZXIgVGVzdC1UeXAgJXNcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjk1MworIywgYy1mb3JtYXQKK21zZ2lkICJJbnZhbGlkIHBhcmFtZXRlciBmb3IgLXMgb3B0aW9uLlxuIgorbXNnc3RyICJVbmfDvGx0aWdlciBXZXJ0IGbDvHIgT3B0aW9uIC1zXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo5NjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5rbm93biBvcHRpb24gJyVjJ1xuIgorbXNnc3RyICJVbmJla2FubnRlIE9wdGlvbnMgJyVjJ1xuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6OTgxCisjLCBjLWZvcm1hdAorbXNnaWQgIlBsYXliYWNrIGRldmljZSBpcyAlc1xuIgorbXNnc3RyICJXaWVkZXJnYWJlLUdlcsOkdCBpc3QgJXNcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjk4MgorIywgYy1mb3JtYXQKK21zZ2lkICJTdHJlYW0gcGFyYW1ldGVycyBhcmUgJWlIeiwgJXMsICVpIGNoYW5uZWxzXG4iCittc2dzdHIgIlN0cmVhbS1QYXJhbWV0ZXIgc2luZCAlaSBIeiwgJXMsICVpIEthbsOkbGVcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjk4NQorIywgYy1mb3JtYXQKK21zZ2lkICJVc2luZyAxNiBvY3RhdmVzIG9mIHBpbmsgbm9pc2VcbiIKK21zZ3N0ciAiVmVyd2VuZGUgMTYgT2t0YXZlbiByb3NhIFJhdXNjaGVuXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo5ODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2luZSB3YXZlIHJhdGUgaXMgJS40Zkh6XG4iCittc2dzdHIgIlNpbnVzd2VsbGUgbWl0IEZyZXF1ZW56ICUuNGYgSHpcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjk5MQorIywgYy1mb3JtYXQKK21zZ2lkICJXQVYgZmlsZShzKVxuIgorbXNnc3RyICJXQVYtRGF0ZWkoZW4pXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo5OTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGxheWJhY2sgb3BlbiBlcnJvcjogJWQsJXNcbiIKK21zZ3N0ciAiRmVobGVyIGJlaW0gw5ZmZm5lbiBkZXMgR2Vyw6R0ZXM6ICVkLCAlc1xuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6MTAwMgorIywgYy1mb3JtYXQKK21zZ2lkICJTZXR0aW5nIG9mIGh3cGFyYW1zIGZhaWxlZDogJXNcbiIKK21zZ3N0ciAiRmVobGVyIGJlaW0gU2V0emVuIGRlciBIYXJkd2FyZS1QYXJhbWV0ZXI6ICVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzoxMDA3CisjLCBjLWZvcm1hdAorbXNnaWQgIlNldHRpbmcgb2Ygc3dwYXJhbXMgZmFpbGVkOiAlc1xuIgorbXNnc3RyICJGZWhsZXIgYmVpbSBTZXR6ZW4gZGVyIFNvZnR3YXJlLVBhcmFtZXRlcjogJXNcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjEwNTYgc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjEwNzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiVHJhbnNmZXIgZmFpbGVkOiAlc1xuIgorbXNnc3RyICJTY2hyZWliZmVobGVyOiAlc1xuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6MTA2NgorIywgYy1mb3JtYXQKK21zZ2lkICJUaW1lIHBlciBwZXJpb2QgPSAlbGZcbiIKK21zZ3N0ciAiWmVpdCBwcm8gUGVyaW9kZSA9ICVsZlxuIgpkaWZmIC0tZ2l0IGEvcG8vZnIucG8gYi9wby9mci5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjAyOGE0Ci0tLSAvZGV2L251bGwKKysrIGIvcG8vZnIucG8KQEAgLTAsMCArMSwxNTY2IEBACisjIEZyZW5jaCB0cmFuc2xhdGlvbiBmb3IgYWxzYS11dGlscworIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFMU0EgVGVhbQorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgYWxzYS11dGlscyBwYWNrYWdlLgorIyBDaHJpc3RvcGggSi4gVGhvbXBzb24gPGNqc3Rob21wc29uQGdtYWlsLmNvbT4sIDIwMTEuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBhbHNhLXV0aWxzIDEuMC4yM1xuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBcbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxMS0wMS0wNyAwNjoyMyswMTAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAxMS0wMS0wNyAwNjoyMyswMTAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBDaHJpc3RvcGggSi4gVGhvbXBzb24gPGNqc3Rob21wc29uQGdtYWlsLmNvbT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBGcmVuY2ggPGZyQGxpLm9yZz5cbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKworIzogLi4vYWxzYW1peGVyL2NhcmRfc2VsZWN0LmM6MTI2IC4uL2Fsc2FtaXhlci9kZXZpY2VfbmFtZS5jOjEyNgorbXNnaWQgIlNvdW5kIENhcmQiCittc2dzdHIgIkNhcnRlIFNvbiIKKworIzogLi4vYWxzYW1peGVyL2NhcmRfc2VsZWN0LmM6MTgxCittc2dpZCAiKGRlZmF1bHQpIgorbXNnc3RyICIocGFyIGTDqWZhdXQpIgorCisjOiAuLi9hbHNhbWl4ZXIvY2FyZF9zZWxlY3QuYzoxOTEKK21zZ2lkICJjYW5ub3QgZW51bWVyYXRlIHNvdW5kIGNhcmRzIgorbXNnc3RyICJsZXMgY2FydGVzIHNvbiBuJ29udCBwYXMgcHUgw6p0cmUgw6ludW3DqXLDqWVzIgorCisjOiAuLi9hbHNhbWl4ZXIvY2FyZF9zZWxlY3QuYzoyMTUKK21zZ2lkICJlbnRlciBkZXZpY2UgbmFtZS4uLiIKK21zZ3N0ciAiZW50cmV6IGxlIG5vbSBkdSBww6lyaXBow6lyaXF1ZS4uLiIKKworIzogLi4vYWxzYW1peGVyL2NsaS5jOjQwCittc2dpZCAiVXNhZ2U6IGFsc2FtaXhlciBbb3B0aW9uc10iCittc2dzdHIgIlV0aWxpc2F0aW9uOiBhbHNhbWl4ZXIgW29wdGlvbnNdIgorCisjOiAuLi9hbHNhbWl4ZXIvY2xpLmM6NDEKK21zZ2lkICIiCisiVXNlZnVsIG9wdGlvbnM6XG4iCisiICAtaCwgLS1oZWxwICAgICAgICAgICAgICB0aGlzIGhlbHBcbiIKKyIgIC1jLCAtLWNhcmQ9TlVNQkVSICAgICAgIHNvdW5kIGNhcmQgbnVtYmVyIG9yIGlkXG4iCisiICAtRCwgLS1kZXZpY2U9TkFNRSAgICAgICBtaXhlciBkZXZpY2UgbmFtZVxuIgorIiAgLVYsIC0tdmlldz1NT0RFICAgICAgICAgc3RhcnRpbmcgdmlldyBtb2RlOiBwbGF5YmFjay9jYXB0dXJlL2FsbCIKK21zZ3N0ciAiIgorIk9wdGlvbnMgdXRpbGVzOlxuIgorIiAgLWgsIC0taGVscCAgICAgICAgICAgY2V0dGUgYWlkZVxuIgorIiAgLWMsIC0tY2FyZD1OVU3DiVJPICAgIG51bcOpcm8gb3UgaWRlbnRpZmlhbnQgZGUgbGEgY2FydGUgc29uXG4iCisiICAtRCwgLS1kZXZpY2U9Tk9NICAgICBub20gZHUgcMOpcmlwaMOpcmlxdWUgZGUgbWl4YWdlXG4iCisiICAtViwgLS12aWV3PU1PREUgICAgICBtb2RlIGRlIHZpc3VhbGlzYXRpb24gcGFyIGTDqWZhdXQ6IGxlY3R1cmUvY2FwdHVyZS90b3VzIgorCisjOiAuLi9hbHNhbWl4ZXIvY2xpLmM6NDYKK21zZ2lkICIiCisiRGVidWdnaW5nIG9wdGlvbnM6XG4iCisiICAtZywgLS1uby1jb2xvciAgICAgICAgICB0b2dnbGUgdXNpbmcgb2YgY29sb3JzXG4iCisiICAtYSwgLS1hYnN0cmFjdGlvbj1OQU1FICBtaXhlciBhYnN0cmFjdGlvbiBsZXZlbDogbm9uZS9iYXNpYyIKK21zZ3N0ciAiIgorIk9wdGlvbnMgZGUgZMOpYm9nYWdlOlxuIgorIiAgLWcsIC0tbm8tY29sb3IgICAgICAgICAgc3VwcHJpbWVyIGxhIGNvdWxldXJcbiIKKyIgIC1hLCAtLWFic3RyYWN0aW9uPU5PTSAgIG5pdmVhdSBkJ2Fic3RyYWN0aW9uIGR1IG1peGV1cjogYXVjdW4vYmFzaXF1ZSIKKworIzogLi4vYWxzYW1peGVyL2NsaS5jOjc3CisjLCBjLWZvcm1hdAorbXNnaWQgImludmFsaWQgY2FyZCBpbmRleDogJXNcbiIKK21zZ3N0ciAiaW5kZXggZGUgY2FydGUgaW52YWxpZGU6ICVzXG4iCisKKyM6IC4uL2Fsc2FtaXhlci9jbGkuYzoxMDMKKyMsIGMtZm9ybWF0Cittc2dpZCAidW5rbm93biBhYnN0cmFjdGlvbiBsZXZlbDogJXNcbiIKK21zZ3N0ciAibml2ZWF1IGQnYWJzdHJhY3Rpb24gaW5jb25udTogJXNcbiIKKworIzogLi4vYWxzYW1peGVyL2NsaS5jOjEwOAorIywgYy1mb3JtYXQKK21zZ2lkICJ1bmtub3duIG9wdGlvbjogJWNcbiIKK21zZ3N0ciAib3B0aW9uIGluY29ubnVlOiAlY1xuIgorCisjOiAuLi9hbHNhbWl4ZXIvY2xpLmM6MTEwCittc2dpZCAidHJ5IGBhbHNhbWl4ZXIgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvblxuIgorbXNnc3RyICJlc3NheWV6IGBhbHNhbWl4ZXIgLS1oZWxwJyBwb3VyIHBsdXMgZCdpbmZvcm1hdGlvblxuIgorCisjOiAuLi9hbHNhbWl4ZXIvZGV2aWNlX25hbWUuYzoxNzcKK21zZ2lkICJEZXZpY2UgbmFtZToiCittc2dzdHIgIk5vbSBkdSBww6lyaXBow6lyaXF1ZToiCisKKyM6IC4uL2Fsc2FtaXhlci9kaWUuYzozNworIywgYy1mb3JtYXQKK21zZ2lkICIlczogJXNcbiIKK21zZ3N0ciAiJXM6ICVzXG4iCisKKyM6IC4uL2Fsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6OTUKK21zZ2lkICJDYXJkOiIKK21zZ3N0ciAiQ2FydGU6IgorCisjOiAuLi9hbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjk2Cittc2dpZCAiQ2hpcDoiCittc2dzdHIgIlB1Y2U6IgorCisjOiAuLi9hbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjk3Cittc2dpZCAiVmlldzoiCittc2dzdHIgIlZ1ZToiCisKKyM6IC4uL2Fsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6OTgKK21zZ2lkICJJdGVtOiIKK21zZ3N0ciAiQ29udHLDtGxlOiIKKworIzogLi4vYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzoxMDEKK21zZ2lkICJGMTogIEhlbHAiCittc2dzdHIgIkYxOiAgQWlkZSIKKworIzogLi4vYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzoxMDIKK21zZ2lkICJGMjogIFN5c3RlbSBpbmZvcm1hdGlvbiIKK21zZ3N0ciAiRjI6ICBJbmZvcm1hdGlvbnMgU3lzdMOobWUiCisKKyM6IC4uL2Fsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6MTAzCittc2dpZCAiRjY6ICBTZWxlY3Qgc291bmQgY2FyZCIKK21zZ3N0ciAiRjY6ICBDaG9pc2lyIGxhIGNhcnRlIHNvbiIKKworIzogLi4vYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzoxMDQKK21zZ2lkICJFc2M6IEV4aXQiCittc2dzdHIgIkVzYzogUXVpdHRlciIKKworIzogLi4vYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzoxNzEKK21zZ2lkICIodW5wbHVnZ2VkKSIKK21zZ3N0ciAiKG5vbiBicmFuY2jDqSkiCisKKyM6IC4uL2Fsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6MTg5Cittc2dpZCAiUGxheWJhY2siCittc2dzdHIgIkxlY3R1cmUiCisKKyM6IC4uL2Fsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6MTkwCittc2dpZCAiQ2FwdHVyZSIKK21zZ3N0ciAiQ2FwdHVyZSIKKworIzogLi4vYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzoxOTEKK21zZ2lkICJBbGwiCittc2dzdHIgIlRvdXQiCisKKyM6IC4uL2Fsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6MjMxCittc2dpZCAibXV0ZSIKK21zZ3N0ciAibXVldCIKKworIzogLi4vYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzoyNzIgLi4vYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzoyODIKK21zZ2lkICJkQiBnYWluOiIKK21zZ3N0ciAiZ2FpbiBkQjoiCisKKyM6IC4uL2Fsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6MjgyCisjLCBjLWZvcm1hdAorbXNnaWQgIiBbJXMgJXMsICVzXSIKK21zZ3N0ciAiIFslcyAlcywgJXNdIgorCisjOiAuLi9hbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjI5MSAuLi9hbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjI5NworIzogLi4vYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzozMDMgLi4vYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzozMDkKK21zZ2lkICJPZmYiCittc2dzdHIgIkZlcm3DqSIKKworIzogLi4vYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzoyOTcgLi4vYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzozMDkKK21zZ2lkICJPbiIKK21zZ3N0ciAiT3V2ZXJ0IgorCisjOiAuLi9hbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjM2MAorbXNnaWQgIlRoZSBzb3VuZCBkZXZpY2Ugd2FzIHVucGx1Z2dlZC4iCittc2dzdHIgIkxlIHDDqXJpcGjDqXJpcXVlIGEgw6l0w6kgZMOpYnJhbmNow6kiCisKKyM6IC4uL2Fsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6MzYxCittc2dpZCAiUHJlc3MgRjYgdG8gc2VsZWN0IGFub3RoZXIgc291bmQgY2FyZC4iCittc2dzdHIgIkFwcHV5ZXogc3VyIEY2IHBvdXIgY2hvaXNpciB1bmUgYXV0cmUgY2FydGUgc29uLiIKKworIzogLi4vYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzozNzYKK21zZ2lkICJUaGlzIHNvdW5kIGRldmljZSBkb2VzIG5vdCBoYXZlIGFueSBwbGF5YmFjayBjb250cm9scy4iCittc2dzdHIgIkNlIHDDqXJpcGjDqXJpcXVlIG4nYSBwYXMgZGUgY29tbWFuZGVzIGRlIGxlY3R1cmUuIgorCisjOiAuLi9hbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjM3OAorbXNnaWQgIlRoaXMgc291bmQgZGV2aWNlIGRvZXMgbm90IGhhdmUgYW55IGNhcHR1cmUgY29udHJvbHMuIgorbXNnc3RyICJDZSBww6lyaXBow6lyaXF1ZSBuJ2EgcGFzIGRlIGNvbW1hbmRlcyBkZSBjYXB0dXJlLiIKKworIzogLi4vYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzozODAKK21zZ2lkICJUaGlzIHNvdW5kIGRldmljZSBkb2VzIG5vdCBoYXZlIGFueSBjb250cm9scy4iCittc2dzdHIgIkNlIHDDqXJpcGjDqXJpcXVlIG4nYSBwYXMgZGUgY29tbWFuZGVzLiIKKworIy4gVFJBTlNMQVRPUlM6IHBsYXliYWNrIG9uOyBvbmUgY2hhcmFjdGVyCisjOiAuLi9hbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjUzNyAuLi9hbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjU0MgorbXNnaWQgIk8iCittc2dzdHIgIk8iCisKKyMuIFRSQU5TTEFUT1JTOiBwbGF5YmFjayBtdXRlZDsgb25lIGNoYXJhY3RlcgorIzogLi4vYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzo1MzkgLi4vYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzo1NDMKK21zZ2lkICJNIgorbXNnc3RyICJNIgorCisjLiBUUkFOU0xBVE9SUzogImxlZnQiOyBubyBtb3JlIHRoYW4gdHdvIGNoYXJhY3RlcnMKKyM6IC4uL2Fsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6NTU3Cittc2dpZCAiTCIKK21zZ3N0ciAiRyIKKworIy4gVFJBTlNMQVRPUlM6ICJyaWdodCI7IG5vIG1vcmUgdGhhbiB0d28gY2hhcmFjdGVycworIzogLi4vYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzo1NjEKK21zZ2lkICJSIgorbXNnc3RyICJEIgorCisjLiBUUkFOU0xBVE9SUzogbm8gbW9yZSB0aGFuIGVpZ2h0IGNoYXJhY3RlcnMKKyM6IC4uL2Fsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6NTYzCittc2dpZCAiQ0FQVFVSRSIKK21zZ3N0ciAiQ0FQVFVSRSIKKworIzogLi4vYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzo2MTMKK21zZ2lkICJGcm9udCIKK21zZ3N0ciAiQXZhbnQiCisKKyM6IC4uL2Fsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6NjE2Cittc2dpZCAiUmVhciIKK21zZ3N0ciAiQXJyacOocmUiCisKKyMuIDQKKyM6IC4uL2Fsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6NjE5IC4uL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzoxMDcKK21zZ2lkICJDZW50ZXIiCittc2dzdHIgIkNlbnRyZSIKKworIzogLi4vYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzo2MjIKK21zZ2lkICJXb29mZXIiCittc2dzdHIgIkJhc3NlcyIKKworIzogLi4vYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzo2MjUKK21zZ2lkICJTaWRlIgorbXNnc3RyICJDw7R0w6kiCisKKyM6IC4uL2Fsc2FtaXhlci9taXhlcl93aWRnZXQuYzo4MyAuLi9hbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6ODgKK21zZ2lkICJjYW5ub3Qgb3BlbiBtaXhlciIKK21zZ3N0ciAibGUgbWl4ZXVyIG5lIHBldXQgcGFzIMOqdHJlIG91dmVydCIKKworIzogLi4vYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjk0IC4uL2Fsc2FtaXhlci9taXhlcl93aWRnZXQuYzoxNzEKK21zZ2lkICJjYW5ub3QgbG9hZCBtaXhlciBjb250cm9scyIKK21zZ3N0ciAibGVzIGNvbW1hbmRlcyBkZSBtaXhhZ2UgbmUgcGV1dmVudCBwYXMgw6p0cmUgY2hhcmfDqXMiCisKKyM6IC4uL2Fsc2FtaXhlci9taXhlcl93aWRnZXQuYzoxNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IG9wZW4gbWl4ZXIgZGV2aWNlICclcycuIgorbXNnc3RyICJMZSBww6lyaXBow6lyaXF1ZSBkZSBtaXhhZ2UgJyVzJyBuZSBwZXV0IHBhcyDDqnRyZSBvdXZlcnQuIgorCisjOiAuLi9hbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MTgyCittc2dpZCAiRXNjICAgICBFeGl0IgorbXNnc3RyICJFc2MgICAgIFF1aXR0ZXIiCisKKyM6IC4uL2Fsc2FtaXhlci9taXhlcl93aWRnZXQuYzoxODMKK21zZ2lkICJGMSA/IEggIEhlbHAiCittc2dzdHIgIkYxID8gSCAgQWlkZSIKKworIzogLi4vYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjE4NAorbXNnaWQgIkYyIC8gICAgU3lzdGVtIGluZm9ybWF0aW9uIgorbXNnc3RyICJGMiAvICAgIEluZm9ybWF0aW9ucyBzeXN0w6htZSIKKworIzogLi4vYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjE4NQorbXNnaWQgIkYzICAgICAgU2hvdyBwbGF5YmFjayBjb250cm9scyIKK21zZ3N0ciAiRjMgICAgICBBZmZpY2hlciBsZXMgY29tbWFuZGVzIGRlIGxlY3R1cmUiCisKKyM6IC4uL2Fsc2FtaXhlci9taXhlcl93aWRnZXQuYzoxODYKK21zZ2lkICJGNCAgICAgIFNob3cgY2FwdHVyZSBjb250cm9scyIKK21zZ3N0ciAiRjQgICAgICBBZmZpY2hlciBsZXMgY29tbWFuZGVzIGRlIGNhcHR1cmUiCisKKyM6IC4uL2Fsc2FtaXhlci9taXhlcl93aWRnZXQuYzoxODcKK21zZ2lkICJGNSAgICAgIFNob3cgYWxsIGNvbnRyb2xzIgorbXNnc3RyICJGNSAgICAgIEFmZmljaGVyIHRvdXRlcyBsZXMgY29tbWFuZGVzIgorCisjOiAuLi9hbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MTg4Cittc2dpZCAiVGFiICAgICBUb2dnbGUgdmlldyBtb2RlIChGMy9GNC9GNSkiCittc2dzdHIgIlRhYiAgICAgQ2hvaXNpciBsZSBtb2RlIGRlIHZpc3VhbGlzYXRpb24gKEYzL0Y0L0Y1KSIKKworIzogLi4vYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjE4OQorbXNnaWQgIkY2IFMgICAgU2VsZWN0IHNvdW5kIGNhcmQiCittc2dzdHIgIkY2IFMgICAgQ2hvaXNpciBsYSBjYXJ0ZSBzb24iCisKKyM6IC4uL2Fsc2FtaXhlci9taXhlcl93aWRnZXQuYzoxOTAKK21zZ2lkICJMICAgICAgIFJlZHJhdyBzY3JlZW4iCittc2dzdHIgIkwgICAgICAgQWN0dWFsaXNlciBsJ8OpY3JhbiIKKworIzogLi4vYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjE5MgorbXNnaWQgIkxlZnQgICAgTW92ZSB0byB0aGUgcHJldmlvdXMgY29udHJvbCIKK21zZ3N0ciAiR2F1Y2hlICBBbGxlciDDoCBsYSBjb21tYW5kZSBwcsOpY8OpZGVudGUiCisKKyM6IC4uL2Fsc2FtaXhlci9taXhlcl93aWRnZXQuYzoxOTMKK21zZ2lkICJSaWdodCAgIE1vdmUgdG8gdGhlIG5leHQgY29udHJvbCIKK21zZ3N0ciAiRHJvaXRlICBBbGxlciDDoCBsYSBjb21tYW5kZSBzdWl2YW50ZSIKKworIzogLi4vYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjE5NQorbXNnaWQgIlVwL0Rvd24gICAgQ2hhbmdlIHZvbHVtZSIKK21zZ3N0ciAiSGF1dC9CYXMgICBBanVzdGVyIGxlIHZvbHVtZSIKKworIzogLi4vYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjE5NgorbXNnaWQgIisgLSAgICAgICAgQ2hhbmdlIHZvbHVtZSIKK21zZ3N0ciAiKyAtICAgICAgICBBanVzdGVyIGxlIHZvbHVtZSIKKworIzogLi4vYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjE5NworbXNnaWQgIlBhZ2UgVXAvRG4gQ2hhbmdlIHZvbHVtZSBpbiBiaWcgc3RlcHMiCittc2dzdHIgIlBhZ2UgUHLDqWMuL1N1aXYuIEFqdXN0ZXIgbGUgdm9sdW1lIGVuIGdyYW5kZXMgaW50ZXJ2YWxsZXMiCisKKyM6IC4uL2Fsc2FtaXhlci9taXhlcl93aWRnZXQuYzoxOTgKK21zZ2lkICJFbmQgICAgICAgIFNldCB2b2x1bWUgdG8gMCUiCittc2dzdHIgIkZpbiAgICAgICAgQ291cGVyIGxlIHZvbHVtZSIKKworIzogLi4vYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjE5OQorbXNnaWQgIjAtOSAgICAgICAgU2V0IHZvbHVtZSB0byAwJS05MCUiCittc2dzdHIgIjAtOSAgICAgICAgQWp1c3RlciBsZSB2b2x1bWUgZW50cmUgMCBldCA5MCUiCisKKyM6IC4uL2Fsc2FtaXhlci9taXhlcl93aWRnZXQuYzoyMDAKK21zZ2lkICJRIFcgRSAgICAgIEluY3JlYXNlIGxlZnQvYm90aC9yaWdodCB2b2x1bWVzIgorbXNnc3RyICJRIFcgRSAgICAgIEF1Z21lbnRlciBsZXMgdm9sdW1lcyBkZSBnYXVjaGUvY2VudHJlL2Ryb2l0ZSIKKworIy4gVFJBTlNMQVRPUlM6IG9yIFkgaW5zdGVhZCBvZiBaCisjOiAuLi9hbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MjAyCittc2dpZCAiWiBYIEMgICAgICBEZWNyZWFzZSBsZWZ0L2JvdGgvcmlnaHQgdm9sdW1lcyIKK21zZ3N0ciAiWiBYIEMgICAgICBCYWlzc2VyIGxlcyB2b2x1bWVzIGRlIGdhdWNoZS9jZW50cmUvZHJvaXRlIgorCisjOiAuLi9hbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MjAzCittc2dpZCAiQiAgICAgICAgICBCYWxhbmNlIGxlZnQgYW5kIHJpZ2h0IHZvbHVtZXMiCittc2dzdHIgIkIgICAgICAgICAgw4lnYWxpc2VyIGxlcyB2b2x1bWVzIGRlIGdhdWNoZSBldCBkcm9pdGUiCisKKyM6IC4uL2Fsc2FtaXhlci9taXhlcl93aWRnZXQuYzoyMDUKK21zZ2lkICJNICAgICAgICAgIFRvZ2dsZSBtdXRlIgorbXNnc3RyICJNICAgICAgICAgIChEw6lzKWFjdGl2ZXIgbGUgbW9kZSBtdWV0IgorCisjLiBUUkFOU0xBVE9SUzogb3IgLCAuCisjOiAuLi9hbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MjA3Cittc2dpZCAiPCA+ICAgICAgICBUb2dnbGUgbGVmdC9yaWdodCBtdXRlIgorbXNnc3RyICI8ID4gICAgICAgIChEw6lzKWFjdGl2ZXIgbGUgbW9kZSBtdWV0IMOgIGdhdWNoZSBldCDDoCBkcm9pdGUiCisKKyM6IC4uL2Fsc2FtaXhlci9taXhlcl93aWRnZXQuYzoyMDkKK21zZ2lkICJTcGFjZSAgICAgIFRvZ2dsZSBjYXB0dXJlIgorbXNnc3RyICJFc3BhY2UgICAgIChEw6lzKWFjdGl2ZXIgbGEgY2FwdHVyZSIKKworIy4gVFJBTlNMQVRPUlM6IG9yIEluc2VydCBEZWxldGUKKyM6IC4uL2Fsc2FtaXhlci9taXhlcl93aWRnZXQuYzoyMTEKK21zZ2lkICI7ICcgICAgICAgIFRvZ2dsZSBsZWZ0L3JpZ2h0IGNhcHR1cmUiCittc2dzdHIgIjsgICAgICAgICAgKETDqXMpYWN0aXZlciBsYSBjYXB0dXJlIMOgIGdhdWNoZSBldCDDoCBkcm9pdGUiCisKKyM6IC4uL2Fsc2FtaXhlci9taXhlcl93aWRnZXQuYzoyMTMKK21zZ2lkICJBdXRob3JzOiIKK21zZ3N0ciAiQXV0ZXVyczoiCisKKyM6IC4uL2Fsc2FtaXhlci9taXhlcl93aWRnZXQuYzoyMTQKK21zZ2lkICIgIFRpbSBKYW5payA8dGltakBndGsub3JnPiIKK21zZ3N0ciAiIgorCisjOiAuLi9hbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MjE1Cittc2dpZCAiICBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PiIKK21zZ3N0ciAiIgorCisjOiAuLi9hbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MjE2Cittc2dpZCAiICBDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4iCittc2dzdHIgIiIKKworIzogLi4vYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjIxOAorbXNnaWQgIkhlbHAiCittc2dzdHIgIkFpZGUiCisKKyM6IC4uL2Fsc2FtaXhlci9wcm9jX2ZpbGVzLmM6MTAzCittc2dpZCAiU2VsZWN0IEZpbGUiCittc2dzdHIgIkNob2lzaXIgdW4gRmljaGllciIKKworIzogLi4vYWxzYW1peGVyL3RleHRib3guYzo1MiAuLi9hbHNhbWl4ZXIvdGV4dGJveC5jOjY2Cittc2dpZCAiRXJyb3IiCittc2dzdHIgIkVycmV1ciIKKworIzogLi4vYWxzYW1peGVyL3RleHRib3guYzo4MAorIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3Qgb3BlbiBmaWxlIFwiJXNcIi4iCittc2dzdHIgIkxlIGZpY2hpZXIgXCIlc1wiIG4nYSBwYXMgcHUgw6p0cmUgb3V2ZXJ0LiIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoxNDcKK21zZ2lkICJyYXcgZGF0YSIKK21zZ3N0ciAiZG9ubsOpZXMgYnJ1dGVzIgorCisjOiAuLi9hcGxheS9hcGxheS5jOjE0OAorbXNnaWQgIlZPQyIKK21zZ3N0ciAiIgorCisjLiBGSVhNRTogY2FuIFdBViBoYW5kbGUgZXhhY3RseSAyR0Igb3IgbGVzcyB0aGFuIGl0PworIzogLi4vYXBsYXkvYXBsYXkuYzoxNTAKK21zZ2lkICJXQVZFIgorbXNnc3RyICIiCisKKyM6IC4uL2FwbGF5L2FwbGF5LmM6MTUxCittc2dpZCAiU3BhcmMgQXVkaW8iCittc2dzdHIgIiIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoxNzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlVzYWdlOiAlcyBbT1BUSU9OXS4uLiBbRklMRV0uLi5cbiIKKyJcbiIKKyItaCwgLS1oZWxwICAgICAgICAgICAgICBoZWxwXG4iCisiICAgIC0tdmVyc2lvbiAgICAgICAgICAgcHJpbnQgY3VycmVudCB2ZXJzaW9uXG4iCisiLWwsIC0tbGlzdC1kZXZpY2VzICAgICAgbGlzdCBhbGwgc291bmRjYXJkcyBhbmQgZGlnaXRhbCBhdWRpbyBkZXZpY2VzXG4iCisiLUwsIC0tbGlzdC1wY21zICAgICAgICAgbGlzdCBkZXZpY2UgbmFtZXNcbiIKKyItRCwgLS1kZXZpY2U9TkFNRSAgICAgICBzZWxlY3QgUENNIGJ5IG5hbWVcbiIKKyItcSwgLS1xdWlldCAgICAgICAgICAgICBxdWlldCBtb2RlXG4iCisiLXQsIC0tZmlsZS10eXBlIFRZUEUgICAgZmlsZSB0eXBlICh2b2MsIHdhdiwgcmF3IG9yIGF1KVxuIgorIi1jLCAtLWNoYW5uZWxzPSMgICAgICAgIGNoYW5uZWxzXG4iCisiLWYsIC0tZm9ybWF0PUZPUk1BVCAgICAgc2FtcGxlIGZvcm1hdCAoY2FzZSBpbnNlbnNpdGl2ZSlcbiIKKyItciwgLS1yYXRlPSMgICAgICAgICAgICBzYW1wbGUgcmF0ZVxuIgorIi1kLCAtLWR1cmF0aW9uPSMgICAgICAgIGludGVycnVwdCBhZnRlciAjIHNlY29uZHNcbiIKKyItTSwgLS1tbWFwICAgICAgICAgICAgICBtbWFwIHN0cmVhbVxuIgorIi1OLCAtLW5vbmJsb2NrICAgICAgICAgIG5vbmJsb2NraW5nIG1vZGVcbiIKKyItRiwgLS1wZXJpb2QtdGltZT0jICAgICBkaXN0YW5jZSBiZXR3ZWVuIGludGVycnVwdHMgaXMgIyBtaWNyb3NlY29uZHNcbiIKKyItQiwgLS1idWZmZXItdGltZT0jICAgICBidWZmZXIgZHVyYXRpb24gaXMgIyBtaWNyb3NlY29uZHNcbiIKKyIgICAgLS1wZXJpb2Qtc2l6ZT0jICAgICBkaXN0YW5jZSBiZXR3ZWVuIGludGVycnVwdHMgaXMgIyBmcmFtZXNcbiIKKyIgICAgLS1idWZmZXItc2l6ZT0jICAgICBidWZmZXIgZHVyYXRpb24gaXMgIyBmcmFtZXNcbiIKKyItQSwgLS1hdmFpbC1taW49IyAgICAgICBtaW4gYXZhaWxhYmxlIHNwYWNlIGZvciB3YWtldXAgaXMgIyBtaWNyb3NlY29uZHNcbiIKKyItUiwgLS1zdGFydC1kZWxheT0jICAgICBkZWxheSBmb3IgYXV0b21hdGljIFBDTSBzdGFydCBpcyAjIG1pY3Jvc2Vjb25kcyBcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAocmVsYXRpdmUgdG8gYnVmZmVyIHNpemUgaWYgPD0gMClcbiIKKyItVCwgLS1zdG9wLWRlbGF5PSMgICAgICBkZWxheSBmb3IgYXV0b21hdGljIFBDTSBzdG9wIGlzICMgbWljcm9zZWNvbmRzIGZyb20gIgorInhydW5cbiIKKyItdiwgLS12ZXJib3NlICAgICAgICAgICBzaG93IFBDTSBzdHJ1Y3R1cmUgYW5kIHNldHVwIChhY2N1bXVsYXRpdmUpXG4iCisiLVYsIC0tdnVtZXRlcj1UWVBFICAgICAgZW5hYmxlIFZVIG1ldGVyIChUWVBFOiBtb25vIG9yIHN0ZXJlbylcbiIKKyItSSwgLS1zZXBhcmF0ZS1jaGFubmVscyBvbmUgZmlsZSBmb3IgZWFjaCBjaGFubmVsXG4iCisiICAgIC0tZGlzYWJsZS1yZXNhbXBsZSAgZGlzYWJsZSBhdXRvbWF0aWMgcmF0ZSByZXNhbXBsZVxuIgorIiAgICAtLWRpc2FibGUtY2hhbm5lbHMgIGRpc2FibGUgYXV0b21hdGljIGNoYW5uZWwgY29udmVyc2lvbnNcbiIKKyIgICAgLS1kaXNhYmxlLWZvcm1hdCAgICBkaXNhYmxlIGF1dG9tYXRpYyBmb3JtYXQgY29udmVyc2lvbnNcbiIKKyIgICAgLS1kaXNhYmxlLXNvZnR2b2wgICBkaXNhYmxlIHNvZnR3YXJlIHZvbHVtZSBjb250cm9sIChzb2Z0dm9sKVxuIgorIiAgICAtLXRlc3QtcG9zaXRpb24gICAgIHRlc3QgcmluZyBidWZmZXIgcG9zaXRpb25cbiIKKyIgICAgLS10ZXN0LWNvZWY9I1x0IHRlc3QgY29lZmljaWVudCBmb3IgcmluZyBidWZmZXIgcG9zaXRpb24gKGRlZmF1bHQgOClcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uIGZvciB2YWxpZGF0aW9uIGlzOiBjb2VmICogKGJ1ZmZlcl9zaXplIC8gIgorIjIpXG4iCisiICAgIC0tdGVzdC1ub3dhaXQgICAgICAgZG8gbm90IHdhaXQgZm9yIHJpbmcgYnVmZmVyIC0gZWF0cyB3aG9sZSBDUFVcbiIKKyIgICAgLS1tYXgtZmlsZS10aW1lPSMgICBzdGFydCBhbm90aGVyIG91dHB1dCBmaWxlIHdoZW4gdGhlIG9sZCBmaWxlIGhhcyAiCisicmVjb3JkZWRcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhpcyBtYW55IHNlY29uZHNcbiIKKyIgICAgLS1wcm9jZXNzLWlkLWZpbGUgICB3cml0ZSB0aGUgcHJvY2VzcyBJRCBoZXJlXG4iCisiICAgIC0tdXNlLXN0cmZ0aW1lICAgICAgYXBwbHkgdGhlIHN0cmZ0aW1lIGZhY2lsaXR5IHRvIHRoZSBvdXRwdXQgZmlsZSBuYW1lXG4iCittc2dzdHIgIiIKKyJVdGlsaXNhdGlvbjogJXMgW09QVElPTl0uLi4gW0ZJQ0hJRVJdLi4uXG4iCisiXG4iCisiLWgsIC0taGVscCAgICAgICAgICAgICAgYWlkZVxuIgorIiAgICAtLXZlcnNpb24gICAgICAgICAgIGFmZmljaGVyIGxhIHZlcnNpb24gZHUgcHJvZ3JhbW1lXG4iCisiLWwsIC0tbGlzdC1kZXZpY2VzICAgICAgYWZmaWNoZXIgbGEgbGlzdGVzIGRlcyBww6lyaXBow6lyaXF1ZXNcbiIKKyItTCwgLS1saXN0LXBjbXMgICAgICAgICBhZmZpY2hlciBsYSBsaXN0ZSBkZXMgbm9tcyBkZSBww6lyaXBow6lyaXF1ZXNcbiIKKyItRCwgLS1kZXZpY2U9Tk9NICAgICAgICBjaG9pc2lyIGxlIHDDqXJpcGjDqXJpcXVlIFBDTSBwYXIgc29uIG5vbVxuIgorIi1RLCAtLXF1aWV0ICAgICAgICAgICAgIG1vZGUgc2lsZW5jaWV1eFxuIgorIi10LCAtLWZpbGUtdHlwZSBUWVBFICAgIHR5cGUgZGUgZmljaGllciAodm9jLCB3YXYsIHJhdyBvdSBhdSlcbiIKKyItYywgLS1jaGFubmVscz0jICAgICAgICBjYW5hdXhcbiIKKyItZiwgLS1mb3JtYXQ9Rk9STUFUICAgICBmb3JtYXQgZCfDqWNoYW50aWxsb25hZ2UgKGluc2Vuc2libGUgw6AgbGEgY2Fzc2UpXG4iCisiLXIsIC0tcmF0ZT0jICAgICAgICAgICAgZnLDqXF1ZW5jZSBkJ8OpY2hhbnRpbGxvbmFnZVxuIgorIi1kLCAtLWR1cmF0aW9uPSMgICAgICAgIGludGVycm9tcHJlIGFwcsOocyAjIHNlY29uZGVzXG4iCisiLU0sIC0tbW1hcCAgICAgICAgICAgICAgY2hhcmdlciBsZSBmbHV4IGVuIG3DqW1vaXJlIGF2ZWMgbW1hcFxuIgorIi1OLCAtLW5vbmJsb2NrICAgICAgICAgIG1vZGUgbm9uLWJsb3F1YW50XG4iCisiLUYsIC0tcGVyaW9kLXRpbWU9IyAgICAgIyBtaWNyb3NlY29uZGVzIGVudHJlIGNoYXF1ZSBpbnRlcnJ1cHRpb25cbiIKKyItQiwgLS1idWZmZXItdGltZT0jICAgICBsYSBkdXLDqWUgZHUgdGFtcG9uIGVzdCBkZSAjIG1pY3Jvc2Vjb25kZXNcbiIKKyIgICAgLS1wZXJpb2Qtc2l6ZT0jICAgICAjIHRyYW1lcyBlbnRyZSBjaGFxdWUgaW50ZXJydXB0aW9uXG4iCisiICAgIC0tYnVmZmVyLXNpemU9IyAgICAgbGEgZHVyw6llIGR1IHRhbXBvbiBlc3QgZGUgIyB0cmFtZXNcbiIKKyItQSwgLS1hdmFpbC1taW49IyAgICAgICAjIG1pY3Jvc2Vjb25kZXMgbWluLiBkaXNwb25pYmxlcyBlbnRyZSBjaGFxdWUgcsOpdmVpbFxuIgorIi1SLCAtLXN0YXJ0LWRlbGF5PSMgICAgICMgbWljcm9zZWNvbmRlcyBkZSBkw6lsYWkgYXZhbnQgbGUgZMOpbWFycmFnZVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpcXVlIGR1IHDDqXJpcGjDqXJpcXVlIFBDTSAocmVsYXRpZiDDoCBsYSB0YWlsbGVcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICBkdSB0YW1wb24gc2kgPD0gMClcbiIKKyItVCwgLS1zdG9wLWRlbGF5PSMgICAgICAjIG1pY3Jvc2Vjb25kZXMgZGUgZMOpbGFpIGRlcHVpcyB4cnVuIGF2YW50IGwnYXJyw6p0XG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGlxdWUgZHUgcMOpcmlwaMOpcmlxdWUgUENNIFxuIgorIi12LCAtLXZlcmJvc2UgICAgICAgICAgIGFmZmljaGVyIGxhIHN0cnVjdHVyZSBldCBsYSBjb25maWd1cmF0aW9uIGR1XG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgcMOpcmlwaMOpcmlxdWUgUENNIChhY2N1bXVsYXRpZilcbiIKKyItViwgLS12dW1ldGVyPVRZUEUgICAgICBhY3RpdmVyIGxlIFZVLW3DqHRyZSAoVFlQRTogbW9ubyBvdSBzdGVyZW8pXG4iCisiLUksIC0tc2VwYXJhdGUtY2hhbm5lbHMgdW4gZmljaGllciBwYXIgY2FuYWxcbiIKKyIgICAgLS1kaXNhYmxlLXJlc2FtcGxlICBkw6lzYWN0aXZlciBsZSByw6nDqWNoYW50aWxsb25hZ2UgZGUgZnLDqXF1ZW5jZVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpcXVlXG4iCisiICAgIC0tZGlzYWJsZS1jaGFubmVscyAgZMOpc2FjdGl2ZXIgbGVzIGNvbnZlcnNpb25zIGF1dG9tYXRpcXVlcyBkZSBjYW5hbFxuIgorIiAgICAtLWRpc2FibGUtZm9ybWF0ICAgIGTDqXNhY3RpdmVyIGxlcyBjb252ZXJzaW9ucyBhdXRvbWF0aXF1ZXMgZGUgZm9ybWF0XG4iCisiICAgIC0tZGlzYWJsZS1zb2Z0dm9sICAgZMOpc2FjdGl2ZXIgbGEgY29tbWFuZGUgZHUgdm9sdW1lIGxvZ2ljaWVsbGVcbiIKKyIgICAgLS10ZXN0LXBvc2l0aW9uICAgICB0ZXN0ZXIgbGEgcG9zaXRpb24gZHUgdGFtcG9uIGNpcmN1bGFpcmVcbiIKKyIgICAgLS10ZXN0LWNvZWY9IyAgICAgICB0ZXN0IGNvZWZmaWNpZW50IHBvdXIgbGEgcG9zaXRpb24gZHUgdGFtcG9uXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgY2lyY3VsYWlyZSAocGFyIGTDqWZhdXQgOCkuIEwnZXhwcmVzc2lvbiBwb3VyIGxhXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbiBlc3QgOiBjb2VmICogKHRhaWxsZV90YW1wb24gLyAyKVxuIgorIiAgICAtLXRlc3Qtbm93YWl0ICAgICAgIG5lIHBhcyBhdHRlbmRyZSBsZSB0YW1wb24gY2lyY3VsYWlyZSAtIHByZW5kIHRvdXRlc1xuIgorIiAgICAgICAgICAgICAgICAgICAgICAgIGxlcyByZXNvdXJjZXMgZHUgcHJvY2Vzc2V1clxuIgorIiAgICAtLW1heC1maWxlLXRpbWU9IyAgIGNvbW1lbmNlciB1biBhdXRyZSBmaWNoaWVyIGRlIGNhcHR1cmUgcXVhbmQgbCdhbmNpZW5cbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICBmaWNoaWVyIGEgZW5yZWdpc3Ryw6kgcGVuZGFudCAjIHNlY29uZGVzXG4iCisiICAgIC0tcHJvY2Vzcy1pZC1maWxlICAgw6ljcmlyZSBsJ2lkZW50aWZpYW50IGR1IHByb2Nlc3N1cyBpY2lcbiIKKyIgICAgLS11c2Utc3RyZnRpbWUgICAgICB1dGlsaXNlciBzdHJmdGltZSBwb3VyIGxlIG5vbSBkdSBmaWNoaWVyIGRlIGNhcHR1cmVcbiIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoyMTEgLi4vc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjc1MAorIywgYy1mb3JtYXQKK21zZ2lkICJSZWNvZ25pemVkIHNhbXBsZSBmb3JtYXRzIGFyZToiCittc2dzdHIgIkxlcyBmb3JtYXRzIGQnw6ljaGFudGlsbG9uYWdlIGNvbm51cyBzb250OiIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoyMTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIlNvbWUgb2YgdGhlc2UgbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gc2VsZWN0ZWQgaGFyZHdhcmVcbiIKK21zZ3N0ciAiIgorIlxuIgorIkNlcnRhaW5zIGRlIGNldXgtY2kgbmUgc29udCBwZXV0IMOqdHJlIHBhcyBkaXNwb25pYmxlcyBhdmVjIGNlIG1hdMOpcmllbFxuIgorCisjOiAuLi9hcGxheS9hcGxheS5jOjIxOAorIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgYXZhaWxhYmxlZCBmb3JtYXQgc2hvcnRjdXRzIGFyZTpcbiIKK21zZ3N0ciAiTGVzIHJhY2NvdXJjaXMgZm9ybWF0IGRpc3BvbmlibGVzIHNvbnQ6XG4iCisKKyM6IC4uL2FwbGF5L2FwbGF5LmM6MjE5CisjLCBjLWZvcm1hdAorbXNnaWQgIi1mIGNkICgxNiBiaXQgbGl0dGxlIGVuZGlhbiwgNDQxMDAsIHN0ZXJlbylcbiIKK21zZ3N0ciAiLWYgY2QgKDE2IGJpdCBwZXRpdCBib3V0aXN0ZSwgNDQxMDAsIHN0w6lyw6lvKVxuIgorCisjOiAuLi9hcGxheS9hcGxheS5jOjIyMAorIywgYy1mb3JtYXQKK21zZ2lkICItZiBjZHIgKDE2IGJpdCBiaWcgZW5kaWFuLCA0NDEwMCwgc3RlcmVvKVxuIgorbXNnc3RyICItZiBjZHIgKDE2IGJpdCBncm9zIGJvdXRpc3RlLCA0NDEwMCwgc3TDqXLDqW8pXG4iCisKKyM6IC4uL2FwbGF5L2FwbGF5LmM6MjIxCisjLCBjLWZvcm1hdAorbXNnaWQgIi1mIGRhdCAoMTYgYml0IGxpdHRsZSBlbmRpYW4sIDQ4MDAwLCBzdGVyZW8pXG4iCittc2dzdHIgIi1mIGRhdCAoMTYgYml0IHBldGl0IGJvdXRpc3RlLCA0ODAwMCwgc3TDqXLDqW8pXG4iCisKKyM6IC4uL2FwbGF5L2FwbGF5LmM6MjM1Cittc2dpZCAibm8gc291bmRjYXJkcyBmb3VuZC4uLiIKK21zZ3N0ciAiYXVjdW5lIGNhcnRlIHNvbiBuJ2Egw6l0w6kgdHJvdXbDqWUuLi4iCisKKyM6IC4uL2FwbGF5L2FwbGF5LmM6MjM4CisjLCBjLWZvcm1hdAorbXNnaWQgIioqKiogTGlzdCBvZiAlcyBIYXJkd2FyZSBEZXZpY2VzICoqKipcbiIKK21zZ3N0ciAiKioqKiBMaXN0ZSBkZXMgUMOpcmlwaMOpcmlxdWVzIE1hdMOpcmllbHMgJXMgKioqKlxuIgorCisjOiAuLi9hcGxheS9hcGxheS5jOjI2NworIywgYy1mb3JtYXQKK21zZ2lkICJjYXJkICVpOiAlcyBbJXNdLCBkZXZpY2UgJWk6ICVzIFslc11cbiIKK21zZ3N0ciAiY2FydGUgJWk6ICVzIFslc10sIHDDqXJpcGjDqXJpcXVlICVpOiAlcyBbJXNdXG4iCisKKyM6IC4uL2FwbGF5L2FwbGF5LmM6MjczCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgU3ViZGV2aWNlczogJWkvJWlcbiIKK21zZ3N0ciAiICBTb3VzLXDDqXJpcGjDqXJpcXVlczogJWkvJWlcbiIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoyODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBTdWJkZXZpY2UgIyVpOiAlc1xuIgorbXNnc3RyICIgIFNvdXMtcMOpcmlwaMOpcmlxdWUgIyVpOiAlc1xuIgorCisjOiAuLi9hcGxheS9hcGxheS5jOjM1NgorIywgYy1mb3JtYXQKK21zZ2lkICJBYm9ydGVkIGJ5IHNpZ25hbCAlcy4uLlxuIgorbXNnc3RyICJJbnRlcnJvbXB1IHBhciBsZSBzaWduYWwgJXMuLi5cbiIKKworIzogLi4vYXBsYXkvYXBsYXkuYzo0NjcKK21zZ2lkICJjb21tYW5kIHNob3VsZCBiZSBuYW1lZCBlaXRoZXIgYXJlY29yZCBvciBhcGxheSIKK21zZ3N0ciAibGEgY29tbWFuZGUgZG9pdCDDqnRyZSBub21tw6llIGFyZWNvcmQgb3UgYXBsYXkiCisKKyM6IC4uL2FwbGF5L2FwbGF5LmM6NTA2CisjLCBjLWZvcm1hdAorbXNnaWQgInVucmVjb2duaXplZCBmaWxlIGZvcm1hdCAlcyIKK21zZ3N0ciAiZm9ybWF0IGRlIGZpY2hpZXIgaW5jb25udSAlcyIKKworIzogLi4vYXBsYXkvYXBsYXkuYzo1MTMKKyMsIGMtZm9ybWF0Cittc2dpZCAidmFsdWUgJWkgZm9yIGNoYW5uZWxzIGlzIGludmFsaWQiCittc2dzdHIgImxhIHZhbGV1ciAlaSBwb3VyIGxlcyBjYW5hdXggZXN0IGluY29ycmVjdGUiCisKKyM6IC4uL2FwbGF5L2FwbGF5LmM6NTMyCisjLCBjLWZvcm1hdAorbXNnaWQgIndyb25nIGV4dGVuZGVkIGZvcm1hdCAnJXMnIgorbXNnc3RyICJmb3JtYXQgw6l0ZW5kdSAnJXMnIGVycm9ubsOpIgorCisjOiAuLi9hcGxheS9hcGxheS5jOjU0MworIywgYy1mb3JtYXQKK21zZ2lkICJiYWQgc3BlZWQgdmFsdWUgJWkiCittc2dzdHIgIm1hdXZhaXNlIHZhbGV1ciBkZSB2aXRlc3NlICVpIgorCisjOiAuLi9hcGxheS9hcGxheS5jOjYzOAorIywgYy1mb3JtYXQKK21zZ2lkICJUcnkgYCVzIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4iCittc2dzdHIgIkVzc2F5ZXogYCVzIC0taGVscCcgcG91ciBwbHVzIGQnaW5mb3JtYXRpb25zLlxuIgorCisjOiAuLi9hcGxheS9hcGxheS5jOjY1NAorIywgYy1mb3JtYXQKK21zZ2lkICJhdWRpbyBvcGVuIGVycm9yOiAlcyIKK21zZ3N0ciAiZXJyZXVyIMOgIGwnb3V2ZXJ0dXJlIGF1ZGlvOiAlcyIKKworIzogLi4vYXBsYXkvYXBsYXkuYzo2NTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiaW5mbyBlcnJvcjogJXMiCittc2dzdHIgImVycmV1ciBpbmZvOiAlcyIKKworIzogLi4vYXBsYXkvYXBsYXkuYzo2NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAibm9uYmxvY2sgc2V0dGluZyBlcnJvcjogJXMiCittc2dzdHIgInBhcmFtw6h0cmUgZGUgbm9uLWJsb2NhZ2UgZXJyb25uw6k6ICVzIgorCisjOiAuLi9hcGxheS9hcGxheS5jOjY3NiAuLi9hcGxheS9hcGxheS5jOjgwMCAuLi9hcGxheS9hcGxheS5jOjExNjcKK21zZ2lkICJub3QgZW5vdWdoIG1lbW9yeSIKK21zZ3N0ciAicGFzIGFzc2V6IGRlIG3DqW1vaXJlIgorCisjOiAuLi9hcGxheS9hcGxheS5jOjcwMAorIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgY3JlYXRlIHByb2Nlc3MgSUQgZmlsZSAlczogJXMiCittc2dzdHIgIkxlIGZpY2hpZXIgZGUgbnVtw6lybyBkZSBwcm9jZXNzdXMgJXMgbidhIHBhcyBwdSDDqnRyZSBjcsOpw6k6ICVzIgorCisjOiAuLi9hcGxheS9hcGxheS5jOjc5MAorIywgYy1mb3JtYXQKK21zZ2lkICJyZWFkIGVycm9yIChjYWxsZWQgZnJvbSBsaW5lICVpKSIKK21zZ3N0ciAiZXJyZXVyIGRlIGxlY3R1cmUgKGFwcGVsw6kgw6AgbGEgbGlnbmUgJWkpIgorCisjOiAuLi9hcGxheS9hcGxheS5jOjg0OAorIywgYy1mb3JtYXQKK21zZ2lkICJ1bmtub3duIGxlbmd0aCBvZiAnZm10ICcgY2h1bmsgKHJlYWQgJXUsIHNob3VsZCBiZSAldSBhdCBsZWFzdCkiCittc2dzdHIgImxvbmd1ZXVyIGR1IG1vcmNlYXUgJ2ZtdCAnIGluY29ubnVlIChsdSAldSwgZGV2cmFpdCDDqnRyZSBhdSBtb2lucyAldSkiCisKKyM6IC4uL2FwbGF5L2FwbGF5LmM6ODU4CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJ1bmtub3duIGxlbmd0aCBvZiBleHRlbnNpYmxlICdmbXQgJyBjaHVuayAocmVhZCAldSwgc2hvdWxkIGJlICV1IGF0IGxlYXN0KSIKK21zZ3N0ciAiIgorImxvbmd1ZXVyIGR1IG1vcmNlYXUgJ2ZtdCAnIGV4dGVuc2libGUgaW5jb25udWUgKGx1ICV1LCBkZXZyYWl0IMOqdHJlIGF1IG1vaW5zICV1KSIKKworIzogLi4vYXBsYXkvYXBsYXkuYzo4NjMKK21zZ2lkICJ3cm9uZyBmb3JtYXQgdGFnIGluIGV4dGVuc2libGUgJ2ZtdCAnIGNodW5rIgorbXNnc3RyICJsaWJlbGzDqSBkZSBmb3JtYXQgZXJyb25uw6kgZGFucyBsZSBtb3JjZWF1IGV4dGVuc2libGUgJ2ZtdCAnIgorCisjOiAuLi9hcGxheS9hcGxheS5jOjg3MAorIywgYy1mb3JtYXQKK21zZ2lkICJjYW4ndCBwbGF5IFdBVkUtZmlsZSBmb3JtYXQgMHglMDR4IHdoaWNoIGlzIG5vdCBQQ00gb3IgRkxPQVQgZW5jb2RlZCIKK21zZ3N0ciAiTGVzIGZvcm1hdHMgZGUgZmljaGVyIFdBVkUgMHglMDR4IHF1aSBuZSBzb250IHBhcyBlbmNvZMOpcyBlbiBQQ00gb3UiCisgICAgICAgIkZMT0FUIG5lIHNvbnQgcGFzIHN1cHBvcnTDqXMiCisKKyM6IC4uL2FwbGF5L2FwbGF5LmM6ODc0CisjLCBjLWZvcm1hdAorbXNnaWQgImNhbid0IHBsYXkgV0FWRS1maWxlcyB3aXRoICVkIHRyYWNrcyIKK21zZ3N0ciAiTGVzIGZpY2hpZXJzIFdBVkUgYXZlYyAlZCBwaXN0ZXMgbmUgc29udCBwYXMgc3VwcG9ydMOpcyIKKworIzogLi4vYXBsYXkvYXBsYXkuYzo4ODIgLi4vYXBsYXkvYXBsYXkuYzo5ODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiV2FybmluZzogZm9ybWF0IGlzIGNoYW5nZWQgdG8gVThcbiIKK21zZ3N0ciAiQXZlcnRpc3NlbWVudDogbGUgZm9ybWF0IGVzdCBjaGFuZ8OpIGVuIFU4XG4iCisKKyM6IC4uL2FwbGF5L2FwbGF5LmM6ODg4CisjLCBjLWZvcm1hdAorbXNnaWQgIldhcm5pbmc6IGZvcm1hdCBpcyBjaGFuZ2VkIHRvIFMxNl9MRVxuIgorbXNnc3RyICJBdmVydGlzc2VtZW50OiBsZSBmb3JtYXQgZXN0IGNoYW5nw6kgZW4gUzE2X0xFXG4iCisKKyM6IC4uL2FwbGF5L2FwbGF5LmM6ODk2CisjLCBjLWZvcm1hdAorbXNnaWQgIldhcm5pbmc6IGZvcm1hdCBpcyBjaGFuZ2VkIHRvIFMyNF8zTEVcbiIKK21zZ3N0ciAiQXZlcnRpc3NlbWVudDogbGUgZm9ybWF0IGVzdCBjaGFuZ8OpIGVuIFMyNF8zTEVcbiIKKworIzogLi4vYXBsYXkvYXBsYXkuYzo5MDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiV2FybmluZzogZm9ybWF0IGlzIGNoYW5nZWQgdG8gUzI0X0xFXG4iCittc2dzdHIgIkF2ZXJ0aXNzZW1lbnQ6IGxlIGZvcm1hdCBlc3QgY2hhbmfDqSBlbiBTMjRfTEVcbiIKKworIzogLi4vYXBsYXkvYXBsYXkuYzo5MDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiBjYW4ndCBwbGF5IFdBVkUtZmlsZXMgd2l0aCBzYW1wbGUgJWQgYml0cyBpbiAlZCBieXRlcyB3aWRlICglZCBjaGFubmVscykiCittc2dzdHIgIiIKKyIgbGVzIGZpY2hpZXJzIFdBVkUgw6ljaGFudGlsbG9uw6lzICVkIGJpdHMgcGFyICVkIG9jdGV0cyBlbiBsYXJnZXVyICglZCBjYW5hdXgpIgorIm5lIHNvbnQgcGFzIHN1cHBvcnTDqXMiCisKKyM6IC4uL2FwbGF5L2FwbGF5LmM6OTE4CisjLCBjLWZvcm1hdAorbXNnaWQgIiBjYW4ndCBwbGF5IFdBVkUtZmlsZXMgd2l0aCBzYW1wbGUgJWQgYml0cyB3aWRlIgorbXNnc3RyICIgbGVzIGZpY2hpZXJzIFdBVkVTIMOpY2hhbnRpbGxvbsOpcyAlZCBiaXRzIGVuIGxhcmdldXIgbmUgc29udCBwYXMiCisic3VwcG9ydMOpcyIKKworIzogLi4vYXBsYXkvYXBsYXkuYzo5NzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiV2FybmluZzogZm9ybWF0IGlzIGNoYW5nZWQgdG8gTVVfTEFXXG4iCittc2dzdHIgIkF2ZXJ0aXNzZW1lbnQ6IGxlIGZvcm1hdCBlc3QgY2hhbmfDqSBlbiBNVV9MQVdcbiIKKworIzogLi4vYXBsYXkvYXBsYXkuYzo5ODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiV2FybmluZzogZm9ybWF0IGlzIGNoYW5nZWQgdG8gUzE2X0JFXG4iCittc2dzdHIgIkF2ZXJ0aXNzZW1lbnQ6IGxlIGZvcm1hdCBlc3QgY2hhbmfDqSBlbiBTMTZfQkVcbiIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoxMDAxIC4uL2FwbGF5L2FwbGF5LmM6MTg0MyAuLi9hcGxheS9hcGxheS5jOjE4NTAKKyM6IC4uL2FwbGF5L2FwbGF5LmM6MjM3MiAuLi9hcGxheS9hcGxheS5jOjIzODQKK21zZ2lkICJyZWFkIGVycm9yIgorbXNnc3RyICJlcnJldXIgZGUgbGVjdHVyZSIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoxMDMxCittc2dpZCAiQnJva2VuIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgUENNOiBubyBjb25maWd1cmF0aW9ucyBhdmFpbGFibGUiCittc2dzdHIgIkNvbmZpZ3VyYXRpb24gZXJyb27DqWUgcG91ciBjZSBww6lyaXBow6lyaXF1ZSBQQ006IHBhcyBkZSBjb25maWd1cmF0aW9uIgorCisjOiAuLi9hcGxheS9hcGxheS5jOjEwNDgKK21zZ2lkICJBY2Nlc3MgdHlwZSBub3QgYXZhaWxhYmxlIgorbXNnc3RyICJDZSB0eXBlIGQnYWNjw6hzIG4nZXN0IHBhcyBkaXNwb25pYmxlIgorCisjOiAuLi9hcGxheS9hcGxheS5jOjEwNTMKK21zZ2lkICJTYW1wbGUgZm9ybWF0IG5vbiBhdmFpbGFibGUiCittc2dzdHIgIkNlIGZvcm1hdCBkJ8OpY2hhbnRpbGxvbmFnZSBuJ2VzdCBwYXMgZGlzcG9uaWJsZSIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoxMDU5Cittc2dpZCAiQ2hhbm5lbHMgY291bnQgbm9uIGF2YWlsYWJsZSIKK21zZ3N0ciAiTm9tYnJlIGRlIGNhbmF1eCBub24gZGlzcG9uaWJsZSIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoxMDc0CisjLCBjLWZvcm1hdAorbXNnaWQgIldhcm5pbmc6IHJhdGUgaXMgbm90IGFjY3VyYXRlIChyZXF1ZXN0ZWQgPSAlaUh6LCBnb3QgPSAlaUh6KVxuIgorbXNnc3RyICJBdmVydGlzc2VtZW50OiBsYSBmcsOpcXVlbmNlIG4nZXN0IHBhcyBwcsOpY2lzZSAoZGVtYW5kw6kgPSAlaUh6LFxuIgorICAgICAgICJvYnRlbnUgPSAlaUh6KVxuIgorCisjOiAuLi9hcGxheS9hcGxheS5jOjEwODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgICAgICAgcGxlYXNlLCB0cnkgdGhlIHBsdWcgcGx1Z2luICVzXG4iCittc2dzdHIgIiAgICAgICAgIHZldWlsbGV6IGVzc2F5ZXogbGUgZ3JlZmZvbiBkZSBicmFuY2hlbWVudCAlc1xuIgorCisjOiAuLi9hcGxheS9hcGxheS5jOjExMTYKK21zZ2lkICJVbmFibGUgdG8gaW5zdGFsbCBodyBwYXJhbXM6IgorbXNnc3RyICJMZXMgcGFyYW3DqHRyZXMgbWF0w6lyaWVsIG4nb250IHBhcyBwdSDDqnRyZSBpbnN0YWxsw6lzOiIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoxMTIzCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbid0IHVzZSBwZXJpb2QgZXF1YWwgdG8gYnVmZmVyIHNpemUgKCVsdSA9PSAlbHUpIgorbXNnc3RyICJVbmUgcMOpcmlvZGUgw6lnYWxlIMOgIGxhIHRhaWxsZSBkdSB0YW1wb24gKCVsdSA9PSAlbHUpIG5lIHBldXQgw6p0cmUiCisgICAgICAgInV0aWxpc8OpZSIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoxMTU0Cittc2dpZCAidW5hYmxlIHRvIGluc3RhbGwgc3cgcGFyYW1zOiIKK21zZ3N0ciAiTGVzIHBhcmFtw6h0cmVzIGxvZ2ljaWVsIG4nb250IHBhcyBwdSDDqnRyZSBpbnN0YWxsw6lzOiIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoxMjI5CisjLCBjLWZvcm1hdAorbXNnaWQgInN0YXR1cyBlcnJvcjogJXMiCittc2dzdHIgImVycmV1ciBkJ8OpdGF0OiAlcyIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoxMjM5IC4uL2FwbGF5L2FwbGF5LmM6MTI1MAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyEhISAoYXQgbGVhc3QgJS4zZiBtcyBsb25nKVxuIgorbXNnc3RyICIlcyEhISAoYXUgbW9pbnMgbG9uZ3VlIGRlICUuM2YgbXMpXG4iCisKKyM6IC4uL2FwbGF5L2FwbGF5LmM6MTI0MCAuLi9hcGxheS9hcGxheS5jOjEyNDMgLi4vYXBsYXkvYXBsYXkuYzoxMjUxCittc2dpZCAidW5kZXJydW4iCittc2dzdHIgInBlcnRlIgorCisjOiAuLi9hcGxheS9hcGxheS5jOjEyNDAgLi4vYXBsYXkvYXBsYXkuYzoxMjUxCittc2dpZCAib3ZlcnJ1biIKK21zZ3N0ciAiZMOpcGFzc2VtZW50IgorCisjOiAuLi9hcGxheS9hcGxheS5jOjEyNTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3RhdHVzOlxuIgorbXNnc3RyICLDiXRhdDpcbiIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoxMjU5CisjLCBjLWZvcm1hdAorbXNnaWQgInhydW46IHByZXBhcmUgZXJyb3I6ICVzIgorbXNnc3RyICIiCisKKyM6IC4uL2FwbGF5L2FwbGF5LmM6MTI2NQorIywgYy1mb3JtYXQKK21zZ2lkICJTdGF0dXMoRFJBSU5JTkcpOlxuIgorbXNnc3RyICIiCisKKyM6IC4uL2FwbGF5L2FwbGF5LmM6MTI2OQorIywgYy1mb3JtYXQKK21zZ2lkICJjYXB0dXJlIHN0cmVhbSBmb3JtYXQgY2hhbmdlPyBhdHRlbXB0aW5nIHJlY292ZXIuLi5cbiIKK21zZ3N0ciAiY2hhbmdlbWVudCBkZSBmb3JtYXQgZGUgZmx1eCBkZSBjYXB0dXJlPyB0ZW50YXRpdmUgZGUgcsOpY3Vww6lyYXRpb24uLi5cbiIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoxMjcxCisjLCBjLWZvcm1hdAorbXNnaWQgInhydW4oRFJBSU5JTkcpOiBwcmVwYXJlIGVycm9yOiAlcyIKK21zZ3N0ciAiIgorCisjOiAuLi9hcGxheS9hcGxheS5jOjEyNzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3RhdHVzKFIvVyk6XG4iCittc2dzdHIgIiIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoxMjgxCisjLCBjLWZvcm1hdAorbXNnaWQgInJlYWQvd3JpdGUgZXJyb3IsIHN0YXRlID0gJXMiCittc2dzdHIgImVycmV1ciBkZSBsZWN0dXJlL8OpY3JpdHVyZSwgw6l0YXQgPSAlcyIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoxMjkxCisjLCBjLWZvcm1hdAorbXNnaWQgIlN1c3BlbmRlZC4gVHJ5aW5nIHJlc3VtZS4gIgorbXNnc3RyICJTdXNwZW5kdS4gVGVudGF0aXZlIGRlIHJlcHJpc2UuICIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoxMjk2CisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZC4gUmVzdGFydGluZyBzdHJlYW0uICIKK21zZ3N0ciAiw4ljaGVjLiBSZWTDqW1hcnJhZ2UgZHUgZmx1eC4iCisKKyM6IC4uL2FwbGF5L2FwbGF5LmM6MTI5OAorIywgYy1mb3JtYXQKK21zZ2lkICJzdXNwZW5kOiBwcmVwYXJlIGVycm9yOiAlcyIKK21zZ3N0ciAic3VzcGVuc2lvbjogcHJlcGFyZSBlcnJvcjogJXMiCisKKyM6IC4uL2FwbGF5L2FwbGF5LmM6MTMwMworIywgYy1mb3JtYXQKK21zZ2lkICJEb25lLlxuIgorbXNnc3RyICJUZXJtaW7DqS5cbiIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoxMzI1CisjLCBjLWZvcm1hdAorbXNnaWQgIiAhY2xpcCAgIgorbXNnc3RyICIiCisKKyM6IC4uL2FwbGF5L2FwbGF5LmM6MTQ3MgorIywgYy1mb3JtYXQKK21zZ2lkICJVbnN1cHBvcnRlZCBiaXQgc2l6ZSAlZC5cbiIKK21zZ3N0ciAiJWQgYml0KHMpIG5vbiBzdXBwb3J0w6kocykuXG4iCisKKyM6IC4uL2FwbGF5L2FwbGF5LmM6MTUwNgorIywgYy1mb3JtYXQKK21zZ2lkICJNYXggcGVhayAoJWxpIHNhbXBsZXMpOiAweCUwOHggIgorbXNnc3RyICJQaWMgbWF4LiAoJWxpIMOpY2hhbnRpbGxvbnMpOiAweCUwOHggIgorCisjOiAuLi9hcGxheS9hcGxheS5jOjE1NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlN1c3BpY2lvdXMgYnVmZmVyIHBvc2l0aW9uICglbGkgdG90YWwpOiBhdmFpbCA9ICVsaSwgZGVsYXkgPSAlbGksIGJ1ZmZlciA9ICUiCisibGlcbiIKK21zZ3N0ciAiIgorIlBvc2l0aW9uIGRlIHRhbXBvbiBzdXNwaWNpZXVzZSAodG90YWwgJWxpKTogZGlzcG8gPSAlbGksIGTDqWxhaSA9ICVsaSwgdGFtcG9uID0iCisiICVsaVxuIgorCisjOiAuLi9hcGxheS9hcGxheS5jOjE2MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAid3JpdGUgZXJyb3I6ICVzIgorbXNnc3RyICJlcnJldXIgZW4gw6ljcml0dXJlOiAlcyIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoxNjQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIndyaXRldiBlcnJvcjogJXMiCittc2dzdHIgImVycmV1ciBkZSB3cml0ZXY6ICVzIgorCisjOiAuLi9hcGxheS9hcGxheS5jOjE2OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAicmVhZCBlcnJvcjogJXMiCittc2dzdHIgImVycmV1ciBlbiBsZWN0dXJlOiAlcyIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoxNzM1CisjLCBjLWZvcm1hdAorbXNnaWQgInJlYWR2IGVycm9yOiAlcyIKK21zZ3N0ciAiZXJyZXVyIGRlIHJlYWR2OiAlcyIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoxNzgzCittc2dpZCAiY2FuJ3QgYWxsb2NhdGUgYnVmZmVyIGZvciBzaWxlbmNlIgorbXNnc3RyICJVbiB0YW1wb24gcG91ciBzaWxlbmNlIG4nYSBwYXMgcHUgw6p0cmUgYWxsb3XDqSIKKworIy4gdG8gc3RkZXJyCisjOiAuLi9hcGxheS9hcGxheS5jOjE3OTIgLi4vYXBsYXkvYXBsYXkuYzoyMDE4IC4uL2FwbGF5L2FwbGF5LmM6MjAyMworIzogLi4vYXBsYXkvYXBsYXkuYzoyMDcwIC4uL2FwbGF5L2FwbGF5LmM6MjA3OSAuLi9hcGxheS9hcGxheS5jOjIwODYKKyM6IC4uL2FwbGF5L2FwbGF5LmM6MjA5NiAuLi9hcGxheS9hcGxheS5jOjIxMDIgLi4vYXBsYXkvYXBsYXkuYzoyMTc0CisjOiAuLi9hcGxheS9hcGxheS5jOjIyMDQgLi4vYXBsYXkvYXBsYXkuYzoyMjE4Cittc2dpZCAid3JpdGUgZXJyb3IiCittc2dzdHIgImVycmV1ciBlbiDDqWNyaXR1cmUiCisKKyM6IC4uL2FwbGF5L2FwbGF5LmM6MTgwNQorIywgYy1mb3JtYXQKK21zZ2lkICJ2b2NfcGNtX2ZsdXNoIC0gc2lsZW5jZSBlcnJvciIKK21zZ3N0ciAidm9jX3BjbV9mbHVzaCAtIGVycmV1ciBkZSBzaWxlbmNlIgorCisjOiAuLi9hcGxheS9hcGxheS5jOjE4MDgKK21zZ2lkICJ2b2NfcGNtX2ZsdXNoIGVycm9yIgorbXNnc3RyICJlcnJldXIgdm9jX3BjbV9mbHVzaCIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoxODM0Cittc2dpZCAibWFsbG9jIGVycm9yIgorbXNnc3RyICJlcnJldXIgbWFsbG9jIgorCisjOiAuLi9hcGxheS9hcGxheS5jOjE4MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGxheWluZyBDcmVhdGl2ZSBMYWJzIENoYW5uZWwgZmlsZSAnJXMnLi4uXG4iCittc2dzdHIgIkxlY3R1cmUgZHUgZmljaGVyIGRlIGNhbmF1eCBDcmVhdGl2ZSBMYWJzICclcycuLi5cbiIKKworIy4gL2Rldi9kc3AgY2FuJ3QgaXQKKyM6IC4uL2FwbGF5L2FwbGF5LmM6MTkwNiAuLi9hcGxheS9hcGxheS5jOjE5OTgKK21zZ2lkICJjYW4ndCBwbGF5IHBhY2tlZCAudm9jIGZpbGVzIgorbXNnc3RyICJsZXMgZmljaGllcnMgLnZvYyBkZSB0eXBlICdwYWNrZWQnIG5lIHNvbnQgcGFzIHN1cHBvcnTDqXMiCisKKyM6IC4uL2FwbGF5L2FwbGF5LmM6MTk1OAorIywgYy1mb3JtYXQKK21zZ2lkICJjYW4ndCBwbGF5IGxvb3BzOyAlcyBpc24ndCBzZWVrYWJsZVxuIgorbXNnc3RyICIlcyBuJ2VzdCBwYXMgbmF2aWdhYmxlOyBsZXMgbW90aWZzIG4nb250IHBhcyBwdSDDqnRyZSBsdXNcbiIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoyMDA3CisjLCBjLWZvcm1hdAorbXNnaWQgInVua25vd24gYmxvY2t0eXBlICVkLiB0ZXJtaW5hdGUuIgorbXNnc3RyICJ0eXBlIGRlIGJsb2MgJWQgaW5jb25udS4gZmluLiIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoyMTM4CisjLCBjLWZvcm1hdAorbXNnaWQgIldhdmUgZG9lc24ndCBzdXBwb3J0ICVzIGZvcm1hdC4uLiIKK21zZ3N0ciAiTGUgZm9ybWF0IHdhdmUgJXMgbidlc3QgcGFzIHN1cHBvcnTDqS4uLiIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoyMTk4CisjLCBjLWZvcm1hdAorbXNnaWQgIlNwYXJjIEF1ZGlvIGRvZXNuJ3Qgc3VwcG9ydCAlcyBmb3JtYXQuLi4iCittc2dzdHIgIkxlIGZvcm1hdCAlcyBTcGFyYyBBdWRpbyBuJ2VzdCBwYXMgc3VwcG9ydMOpLi4uIgorCisjOiAuLi9hcGxheS9hcGxheS5jOjIyNzkKK21zZ2lkICJQbGF5aW5nIgorbXNnc3RyICJMZWN0dXJlIgorCisjOiAuLi9hcGxheS9hcGxheS5jOjIyNzkKK21zZ2lkICJSZWNvcmRpbmciCittc2dzdHIgIkNhcHR1cmUiCisKKyM6IC4uL2FwbGF5L2FwbGF5LmM6MjI4MworIywgYy1mb3JtYXQKK21zZ2lkICJSYXRlICVkIEh6LCAiCittc2dzdHIgIkZyw6lxdWVuY2UgJWQgSHosICIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoyMjg1CisjLCBjLWZvcm1hdAorbXNnaWQgIk1vbm8iCittc2dzdHIgIiIKKworIzogLi4vYXBsYXkvYXBsYXkuYzoyMjg3CisjLCBjLWZvcm1hdAorbXNnaWQgIlN0ZXJlbyIKK21zZ3N0ciAiU3TDqXLDqW8iCisKKyM6IC4uL2FwbGF5L2FwbGF5LmM6MjI4OQorIywgYy1mb3JtYXQKK21zZ2lkICJDaGFubmVscyAlaSIKK21zZ3N0ciAiJWkgQ2FuYXV4IgorCisjOiAuLi9hcGxheS9hcGxheS5jOjI3OTggLi4vYXBsYXkvYXBsYXkuYzoyODUxCisjLCBjLWZvcm1hdAorbXNnaWQgIllvdSBuZWVkIHRvIHNwZWNpZnkgJWQgZmlsZXMiCittc2dzdHIgIlZvdXMgZGV2ZXogc3DDqWNpZmllciAlZCBmaWNoaWVycyIKKworIzogLi4vc2VxL2Fjb25uZWN0L2Fjb25uZWN0LmM6NDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiYWNvbm5lY3QgLSBBTFNBIHNlcXVlbmNlciBjb25uZWN0aW9uIG1hbmFnZXJcbiIKK21zZ3N0ciAiYWNvbm5lY3QgLSBnZXN0aW9ubmFpcmUgZGUgY29ubmVjdGlvbiBzw6lxdWVuY2V1ciBBTFNBXG4iCisKKyM6IC4uL3NlcS9hY29ubmVjdC9hY29ubmVjdC5jOjUwCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvcHlyaWdodCAoQykgMTk5OS0yMDAwIFRha2FzaGkgSXdhaVxuIgorbXNnc3RyICIiCisKKyM6IC4uL3NlcS9hY29ubmVjdC9hY29ubmVjdC5jOjUxCisjLCBjLWZvcm1hdAorbXNnaWQgIlVzYWdlOlxuIgorbXNnc3RyICJVdGlsaXNhdGlvbjpcbiIKKworIzogLi4vc2VxL2Fjb25uZWN0L2Fjb25uZWN0LmM6NTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiICogQ29ubmVjdGlvbi9kaXNjb25uZWN0aW9uIGJldHdlZW4gdHdvIHBvcnRzXG4iCittc2dzdHIgIiAqIENvbm5leGlvbi9kw6ljb25uZXhpb24gZW50cmUgZGV1eCBwb3J0c1xuIgorCisjOiAuLi9zZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzo1MworIywgYy1mb3JtYXQKK21zZ2lkICIgICBhY29ubmVjdCBbLW9wdGlvbnNdIHNlbmRlciByZWNlaXZlclxuIgorbXNnc3RyICIgICBhY29ubmVjdCBbLW9wdGlvbnNdIGVudm95ZXVyIGRlc3RpbmF0YWlyZVxuIgorCisjOiAuLi9zZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzo1NAorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgIHNlbmRlciwgcmVjZWl2ZXIgPSBjbGllbnQ6cG9ydCBwYWlyXG4iCittc2dzdHIgIiAgICAgZW52b3lldXIsIGRlc3RpbmF0YWlyZSA9IGNvdXBsZSBjbGllbnQ6cG9ydFxuIgorCisjOiAuLi9zZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzo1NQorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgIC1kLC0tZGlzY29ubmVjdCAgICAgZGlzY29ubmVjdFxuIgorbXNnc3RyICIgICAgIC1kLC0tZGlzY29ubmVjdCAgICAgZMOpY29ubmVjdGVyXG4iCisKKyM6IC4uL3NlcS9hY29ubmVjdC9hY29ubmVjdC5jOjU2CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICAgLWUsLS1leGNsdXNpdmUgICAgICBleGNsdXNpdmUgY29ubmVjdGlvblxuIgorbXNnc3RyICIgICAgIC1lLC0tZXhjbHVzaXZlICAgICAgY29ubmV4aW9uIGV4Y2x1c2l2ZVxuIgorCisjOiAuLi9zZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzo1NworIywgYy1mb3JtYXQKK21zZ2lkICIgICAgIC1yLC0tcmVhbCAjICAgICAgICAgY29udmVydCByZWFsLXRpbWUtc3RhbXAgb24gcXVldWVcbiIKK21zZ3N0ciAiIgorCisjOiAuLi9zZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzo1OAorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgIC10LC0tdGljayAjICAgICAgICAgY29udmVydCB0aWNrLXRpbWUtc3RhbXAgb24gcXVldWVcbiIKK21zZ3N0ciAiIgorCisjOiAuLi9zZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzo1OQorIywgYy1mb3JtYXQKK21zZ2lkICIgKiBMaXN0IGNvbm5lY3RlZCBwb3J0cyAobm8gc3Vic2NyaXB0aW9uIGFjdGlvbilcbiIKK21zZ3N0ciAiICogQWZmaWNoZXIgbGEgbGlzdGUgZGVzIHBvcnRzIGNvbm5lY3TDqXMgKHBhcyBkZSBzb3VzY3JpcHRpb24pXG4iCisKKyM6IC4uL3NlcS9hY29ubmVjdC9hY29ubmVjdC5jOjYwCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgIGFjb25uZWN0IC1pfC1vIFstb3B0aW9uc11cbiIKK21zZ3N0ciAiICAgYWNvbm5lY3QgLWl8LW8gWy1vcHRpb25zXVxuIgorCisjOiAuLi9zZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzo2MQorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgIC1pLC0taW5wdXQgICAgICAgICAgbGlzdCBpbnB1dCAocmVhZGFibGUpIHBvcnRzXG4iCittc2dzdHIgIiAgICAgLWksLS1pbnB1dCAgICAgICAgICBhZmZpY2hlciBsYSBsaXN0ZSBkZXMgcG9ydHMgZCdlbnRyw6llXG4iCisKKyM6IC4uL3NlcS9hY29ubmVjdC9hY29ubmVjdC5jOjYyCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICAgLW8sLS1vdXRwdXQgICAgICAgICBsaXN0IG91dHB1dCAod3JpdGFibGUpIHBvcnRzXG4iCittc2dzdHIgIiAgICAgLW8sLS1vdXRwdXQgICAgICAgICBhZmZpY2hlciBsYSBsaXN0ZSBkZXMgcG9ydHMgZGUgc29ydGllXG4iCisKKyM6IC4uL3NlcS9hY29ubmVjdC9hY29ubmVjdC5jOjYzCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICAgLWwsLS1saXN0ICAgICAgICAgICBsaXN0IGN1cnJlbnQgY29ubmVjdGlvbnMgb2YgZWFjaCBwb3J0XG4iCittc2dzdHIgIiAgICAgLWwsLS1saXN0ICAgICAgICAgICBhZmZpY2hlciBsYSBsaXN0ZSBkZXMgY29ubmV4aW9ucyBlbiBjb3Vyc1xuIgorICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgc3VyIGNoYXF1ZSBwb3J0XG4iCisKKyM6IC4uL3NlcS9hY29ubmVjdC9hY29ubmVjdC5jOjY0CisjLCBjLWZvcm1hdAorbXNnaWQgIiAqIFJlbW92ZSBhbGwgZXhwb3J0ZWQgY29ubmVjdGlvbnNcbiIKK21zZ3N0ciAiICogUmV0aXJlciB0b3V0ZXMgbGVzIGNvbm5leGlvbnMgZXhwb3J0w6llc1xuIgorCisjOiAuLi9zZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzo2NQorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgIC14LCAtLXJlbW92ZWFsbFxuIgorbXNnc3RyICIgICAgIC14LCAtLXJlbW92ZWFsbFxuIgorCisjOiAuLi9zZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzoxMzIKK21zZ2lkICJDb25uZWN0aW5nIFRvIgorbXNnc3RyICJDb25uZXhpb24gw4AiCisKKyM6IC4uL3NlcS9hY29ubmVjdC9hY29ubmVjdC5jOjEzMworbXNnaWQgIkNvbm5lY3RlZCBGcm9tIgorbXNnc3RyICJDb25uZWN0w6kgRGVwdWlzIgorCisjOiAuLi9zZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzoxNjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiY2xpZW50ICVkOiAnJXMnIFt0eXBlPSVzXVxuIgorbXNnc3RyICJjbGllbnQgJWQ6ICclcycgW3R5cGU9JXNdXG4iCisKKyM6IC4uL3NlcS9hY29ubmVjdC9hY29ubmVjdC5jOjE3MworbXNnaWQgInVzZXIiCittc2dzdHIgInV0aWxpc2F0ZXVyIgorCisjOiAuLi9zZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzoxNzMKK21zZ2lkICJrZXJuZWwiCittc2dzdHIgIm5veWF1IgorCisjOiAuLi9zZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzozMDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiY2FuJ3Qgb3BlbiBzZXF1ZW5jZXJcbiIKK21zZ3N0ciAibGUgc8OpcXVlbmNldXIgbidhIHBhcyBwdSDDqnRyZSBvdXZlcnRcbiIKKworIzogLi4vc2VxL2Fjb25uZWN0L2Fjb25uZWN0LmM6MzM1CisjLCBjLWZvcm1hdAorbXNnaWQgImNhbid0IGdldCBjbGllbnQgaWRcbiIKK21zZ3N0ciAibCdpZGVudGlmaWFudCBkdSBjbGllbnQgbidhcyBwYXMgcHUgw6p0cmUgb2J0ZW51XG4iCisKKyM6IC4uL3NlcS9hY29ubmVjdC9hY29ubmVjdC5jOjM0MgorIywgYy1mb3JtYXQKK21zZ2lkICJjYW4ndCBzZXQgY2xpZW50IGluZm9cbiIKK21zZ3N0ciAibGVzIGluZm9zIGR1IGNsaWVudCBuJ29udCBwYXMgcHUgw6p0cmUgZMOpZmluaWVzXG4iCisKKyM6IC4uL3NlcS9hY29ubmVjdC9hY29ubmVjdC5jOjM0OQorIywgYy1mb3JtYXQKK21zZ2lkICJpbnZhbGlkIHNlbmRlciBhZGRyZXNzICVzXG4iCittc2dzdHIgImwnYWRkcmVzc2UgZW52b3lldXIgJXMgZXN0IGluY29ycmVjdGVcbiIKKworIzogLi4vc2VxL2Fjb25uZWN0L2Fjb25uZWN0LmM6MzU0IC4uL3NlcS9hc2VxbmV0L2FzZXFuZXQuYzoyOTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiaW52YWxpZCBkZXN0aW5hdGlvbiBhZGRyZXNzICVzXG4iCittc2dzdHIgImwnYWRkcmVzc2UgZGVzdGluYXRhaXJlICVzIGVzdCBpbmNvcnJlY3RlXG4iCisKKyM6IC4uL3NlcS9hY29ubmVjdC9hY29ubmVjdC5jOjM2OAorIywgYy1mb3JtYXQKK21zZ2lkICJObyBzdWJzY3JpcHRpb24gaXMgZm91bmRcbiIKK21zZ3N0ciAiQXVjdW5lIHNvdXNjcmlwdGlvbiB0cm91dsOpZVxuIgorCisjOiAuLi9zZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzozNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGlzY29ubmVjdGlvbiBmYWlsZWQgKCVzKVxuIgorbXNnc3RyICJMYSBkw6ljb25uZXhpb24gYSDDqWNob3XDqSAoJXMpXG4iCisKKyM6IC4uL3NlcS9hY29ubmVjdC9hY29ubmVjdC5jOjM3OQorIywgYy1mb3JtYXQKK21zZ2lkICJDb25uZWN0aW9uIGlzIGFscmVhZHkgc3Vic2NyaWJlZFxuIgorbXNnc3RyICJMYSBjb25uZXhpb24gYSBkw6lqw6Agw6l0w6kgc291c2NyaXRlXG4iCisKKyM6IC4uL3NlcS9hY29ubmVjdC9hY29ubmVjdC5jOjM4NAorIywgYy1mb3JtYXQKK21zZ2lkICJDb25uZWN0aW9uIGZhaWxlZCAoJXMpXG4iCittc2dzdHIgIsOJY2hlYyBkZSBjb25uZXhpb24gKCVzKVxuIgorCisjOiAuLi9zZXEvYXNlcW5ldC9hc2VxbmV0LmM6MTY0CisjLCBjLWZvcm1hdAorbXNnaWQgImFzZXFuZXQgLSBuZXR3b3JrIGNsaWVudC9zZXJ2ZXIgb24gQUxTQSBzZXF1ZW5jZXJcbiIKK21zZ3N0ciAiYXNlcW5ldCAtIGNsaWVudC9zZXJ2ZXVyIHLDqXNlYXUgc3VyIGxlIHPDqXF1ZW5jZXVyIEFMU0FcbiIKKworIzogLi4vc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjE2NQorIywgYy1mb3JtYXQKK21zZ2lkICIgIENvcHlyaWdodCAoQykgMTk5OSBUYWthc2hpIEl3YWlcbiIKK21zZ3N0ciAiIgorCisjOiAuLi9zZXEvYXNlcW5ldC9hc2VxbmV0LmM6MTY2CisjLCBjLWZvcm1hdAorbXNnaWQgInVzYWdlOlxuIgorbXNnc3RyICJ1dGlsaXNhdGlvbjpcbiIKKworIzogLi4vc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjE2NworIywgYy1mb3JtYXQKK21zZ2lkICIgIHNlcnZlciBtb2RlOiBhc2VxbmV0IFstb3B0aW9uc11cbiIKK21zZ3N0ciAiICBtb2RlIHNlcnZldXI6IGFzZXFuZXQgWy1vcHRpb25zXVxuIgorCisjOiAuLi9zZXEvYXNlcW5ldC9hc2VxbmV0LmM6MTY4CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgY2xpZW50IG1vZGU6IGFzZXFuZXQgWy1vcHRpb25zXSBzZXJ2ZXJfaG9zdFxuIgorbXNnc3RyICIgIG1vZGUgY2xpZW50OiBhc2VxbmV0IFstb3B0aW9uc10gaMO0dGVfc2VydmV1clxuIgorCisjOiAuLi9zZXEvYXNlcW5ldC9hc2VxbmV0LmM6MTY5CisjLCBjLWZvcm1hdAorbXNnaWQgIm9wdGlvbnM6XG4iCittc2dzdHIgIm9wdGlvbnM6XG4iCisKKyM6IC4uL3NlcS9hc2VxbmV0L2FzZXFuZXQuYzoxNzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtcCwtLXBvcnQgIyA6IHNlcGNpZnkgVENQIHBvcnQgKGRpZ2l0IG9yIHNlcnZpY2UgbmFtZSlcbiIKK21zZ3N0ciAiICAtcCwtLXBvcnQgIyA6IHNww6ljaWZpZXIgbGUgcG9ydCBUQ1AgKG51bcOpcm8gb3Ugbm9tIGRlIHNlcnZpY2UpXG4iCisKKyM6IC4uL3NlcS9hc2VxbmV0L2FzZXFuZXQuYzoxNzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtcywtLXNvdXJjZSBhZGRyIDogcmVhZCBmcm9tIGdpdmVuIGFkZHIgKGNsaWVudDpwb3J0KVxuIgorbXNnc3RyICIgIC1zLC0tc291cmNlIGFkZHIgOiBsaXJlIMOgIHBhcnRpciBkZSBsJ2FkZHIuIGRvbm7DqWUgKGNsaWVudDpwb3J0KVxuIgorCisjOiAuLi9zZXEvYXNlcW5ldC9hc2VxbmV0LmM6MTcyCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLWQsLS1kZXN0IGFkZHIgOiB3cml0ZSB0byBnaXZlbiBhZGRyIChjbGllbnQ6cG9ydClcbiIKK21zZ3N0ciAiICAtZCwtLWRlc3QgYWRkciA6IMOpY3JpcmUgw6AgbCdhZGRyLiBkb25uw6llIChjbGllbnQ6cG9ydClcbiIKKworIzogLi4vc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjE3MworIywgYy1mb3JtYXQKK21zZ2lkICIgIC12LCAtLXZlcmJvc2UgOiBwcmludCB2ZXJib3NlIG1lc3NhZ2VzXG4iCittc2dzdHIgIiAgLXYsIC0tdmVyYm9zZSA6IGFmZmljaGFnZSBsb2NhY2UgZGUgbWVzc2FnZXNcbiIKKworIzogLi4vc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjE3NAorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1pLCAtLWluZm8gOiBwcmludCBjZXJ0YWluIHJlY2VpdmVkIGV2ZW50c1xuIgorbXNnc3RyICIgIC1pLCAtLWluZm8gOiBhZmZpY2hlciBjZXJ0YWlucyDDqXbDqG5lbWVudHMgcmXDp3VzXG4iCisKKyM6IC4uL3NlcS9hc2VxbmV0L2FzZXFuZXQuYzoxODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiY2FuJ3QgbWFsbG9jXG4iCittc2dzdHIgIsOpY2hlYyBhbGxvY2F0aW9uIG3DqW1vaXJlIChtYWxsb2MpXG4iCisKKyM6IC4uL3NlcS9hc2VxbmV0L2FzZXFuZXQuYzoyMTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiY2xvc2luZyBmaWxlcy4uXG4iCittc2dzdHIgImZlcm1ldHVyZSBkZXMgZmljaGllcnMuLi5cbiIKKworIzogLi4vc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjI3MgorIywgYy1mb3JtYXQKK21zZ2lkICJzZXF1ZW5jZXIgb3BlbmVkOiAlZDolZFxuIgorbXNnc3RyICJzw6lxdWVuY2V1ciBvdXZlcnQ6ICVkOiVkXG4iCisKKyM6IC4uL3NlcS9hc2VxbmV0L2FzZXFuZXQuYzoyNzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiaW52YWxpZCBzb3VyY2UgYWRkcmVzcyAlc1xuIgorbXNnc3RyICJhZGRyZXNzZSBzb3VyY2UgJXMgaW5jb3JyZWN0ZVxuIgorCisjOiAuLi9zZXEvYXNlcW5ldC9hc2VxbmV0LmM6MzA5CisjLCBjLWZvcm1hdAorbXNnaWQgInNlcnZpY2UgJyVzJyBpcyBub3QgZm91bmQgaW4gL2V0Yy9zZXJ2aWNlc1xuIgorbXNnc3RyICJsZSBzZXJ2aWNlICclcycgbidhcyBwYXMgw6l0w6kgdHJvdXbDqSBkYW5zIC9ldGMvc2VydmljZXNcbiIKKworIzogLi4vc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjM3NworIywgYy1mb3JtYXQKK21zZ2lkICJ0b28gbWFueSBjb25uZWN0aW9ucyFcbiIKK21zZ3N0ciAidHJvcCBkZSBjb25uZXhpb25zIVxuIgorCisjOiAuLi9zZXEvYXNlcW5ldC9hc2VxbmV0LmM6Mzg4CisjLCBjLWZvcm1hdAorbXNnaWQgImFjY2VwdGVkWyVkXVxuIgorbXNnc3RyICJhY2NlcHTDqVslZF1cbiIKKworIzogLi4vc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjQxMQorIywgYy1mb3JtYXQKK21zZ2lkICJjYW4ndCBnZXQgYWRkcmVzcyAlc1xuIgorbXNnc3RyICJsJ2FkZHJlc3NlICVzIG5hIHBhcyBwdSDDqnRyZSBvYnRlbnVlXG4iCisKKyM6IC4uL3NlcS9hc2VxbmV0L2FzZXFuZXQuYzo0MjIKKyMsIGMtZm9ybWF0Cittc2dpZCAib2suLiBjb25uZWN0ZWRcbiIKK21zZ3N0ciAib2suLiBjb25uZWN0w6lcbiIKKworIzogLi4vc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjUxOAorIywgYy1mb3JtYXQKK21zZ2lkICJDaGFubmVsICUyZDogQ29udHJvbCBldmVudCA6ICU1ZFxuIgorbXNnc3RyICJDYW5hbCAlMmQ6IMOJdsOobmVtZW50IGRlIGNvbnRyw7RsZTogJTVkXG4iCisKKyM6IC4uL3NlcS9hc2VxbmV0L2FzZXFuZXQuYzo1MjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2hhbm5lbCAlMmQ6IFBpdGNoYmVuZGVyICAgOiAlNWRcbiIKK21zZ3N0ciAiQ2FuYWwgJTJkOiBQaXRjaGJlbmRlciAgICAgICAgICA6ICU1ZFxuIgorCisjOiAuLi9zZXEvYXNlcW5ldC9hc2VxbmV0LmM6NTI2CisjLCBjLWZvcm1hdAorbXNnaWQgIkNoYW5uZWwgJTJkOiBOb3RlIE9uIGV2ZW50IDogJTVkXG4iCittc2dzdHIgIkNhbmFsICUyZDogw6l2w6huZW1lbnQgTm90ZSBPbiAgICA6ICU1ZFxuIgorCisjOiAuLi9zZXEvYXNlcW5ldC9hc2VxbmV0LmM6NTMwCisjLCBjLWZvcm1hdAorbXNnaWQgIkNoYW5uZWwgJTJkOiBOb3RlIE9mZiBldmVudDogJTVkXG4iCittc2dzdHIgIkNhbmFsICUyZDogw6l2w6huZW1lbnQgTm90ZSBPZmYgICA6ICU1ZFxuIgorCisjOiAuLi9zZXEvYXNlcW5ldC9hc2VxbmV0LmM6NTg1CisjLCBjLWZvcm1hdAorbXNnaWQgImRpc2Nvbm5lY3RlZFxuIgorbXNnc3RyICJkw6ljb25uZWN0w6lcbiIKKworIy4gMAorIzogLi4vc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjEwMworbXNnaWQgIkZyb250IExlZnQiCittc2dzdHIgIkF2YW50IEdhdWNoZSIKKworIy4gMQorIzogLi4vc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjEwNAorbXNnaWQgIkZyb250IFJpZ2h0IgorbXNnc3RyICJBdmFudCBEcm9pdCIKKworIy4gMgorIzogLi4vc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjEwNQorbXNnaWQgIlJlYXIgTGVmdCIKK21zZ3N0ciAiQXJyacOocmUgR2F1Y2hlIgorCisjLiAzCisjOiAuLi9zcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6MTA2Cittc2dpZCAiUmVhciBSaWdodCIKK21zZ3N0ciAiQXJyacOocmUgRHJvaXQiCisKKyMuIDUKKyM6IC4uL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzoxMDgKK21zZ2lkICJMRkUiCittc2dzdHIgIiIKKworIy4gNgorIzogLi4vc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjEwOQorbXNnaWQgIlNpZGUgTGVmdCIKK21zZ3N0ciAiQ8O0dMOpIEdhdWNoZSIKKworIy4gNworIzogLi4vc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjExMAorbXNnaWQgIlNpZGUgUmlnaHQiCittc2dzdHIgIkPDtHTDqSBEcm9pdCIKKworIy4gOAorIzogLi4vc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjExMQorbXNnaWQgIkNoYW5uZWwgOSIKK21zZ3N0ciAiQ2FuYWwgOSIKKworIy4gOQorIzogLi4vc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjExMgorbXNnaWQgIkNoYW5uZWwgMTAiCittc2dzdHIgIkNhbmFsIDEwIgorCisjLiAxMAorIzogLi4vc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjExMworbXNnaWQgIkNoYW5uZWwgMTEiCittc2dzdHIgIkNhbmFsIDExIgorCisjLiAxMQorIzogLi4vc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjExNAorbXNnaWQgIkNoYW5uZWwgMTIiCittc2dzdHIgIkNhbmFsIDEyIgorCisjLiAxMgorIzogLi4vc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjExNQorbXNnaWQgIkNoYW5uZWwgMTMiCittc2dzdHIgIkNhbmFsIDEzIgorCisjLiAxMworIzogLi4vc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjExNgorbXNnaWQgIkNoYW5uZWwgMTQiCittc2dzdHIgIkNhbmFsIDE0IgorCisjLiAxNAorIzogLi4vc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjExNworbXNnaWQgIkNoYW5uZWwgMTUiCittc2dzdHIgIkNhbmFsIDE1IgorCisjLiAxNQorIzogLi4vc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjExOAorbXNnaWQgIkNoYW5uZWwgMTYiCittc2dzdHIgIkNhbmFsIDE2IgorCisjOiAuLi9zcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6MzE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkJyb2tlbiBjb25maWd1cmF0aW9uIGZvciBwbGF5YmFjazogbm8gY29uZmlndXJhdGlvbnMgYXZhaWxhYmxlOiAlc1xuIgorbXNnc3RyICJDb25maWd1cmF0aW9uIGVycm9uw6llIHBvdXIgbGEgbGVjdHVyZTogcGFzIGRlIGNvbmZpZ3VyYXRpb246ICVzXG4iCisKKyM6IC4uL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzozMjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQWNjZXNzIHR5cGUgbm90IGF2YWlsYWJsZSBmb3IgcGxheWJhY2s6ICVzXG4iCittc2dzdHIgIkxlIHR5cGUgZCdhY2PDqHMgZXN0IGluZGlzcG9uaWJsZSDDoCBsYSBsZWN0dXJlOiAlc1xuIgorCisjOiAuLi9zcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6MzMxCisjLCBjLWZvcm1hdAorbXNnaWQgIlNhbXBsZSBmb3JtYXQgbm90IGF2YWlsYWJsZSBmb3IgcGxheWJhY2s6ICVzXG4iCittc2dzdHIgIkxlIGZvcm1hdCBkJ8OpY2hhbnRpbGxvbmFnZSBlc3QgaW5kaXNwb25pYmxlIMOgIGxhIGxlY3R1cmU6ICVzXG4iCisKKyM6IC4uL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzozMzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2hhbm5lbHMgY291bnQgKCVpKSBub3QgYXZhaWxhYmxlIGZvciBwbGF5YmFja3M6ICVzXG4iCittc2dzdHIgIkxlIG5vbWJyZSAoJWkpIGRlIGNhbmF1eCBlc3QgaW5kaXNwb25pYmxlIMOgIGxhIGxlY3R1cmU6ICVzXG4iCisKKyM6IC4uL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzozNDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmF0ZSAlaUh6IG5vdCBhdmFpbGFibGUgZm9yIHBsYXliYWNrOiAlc1xuIgorbXNnc3RyICJMYSBmcsOpcXVlbmNlICVpSHogZXN0IGluZGlzcG9uaWJsZSDDoCBsYSBsZWN0dXJlOiAlc1xuIgorCisjOiAuLi9zcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6MzUxCisjLCBjLWZvcm1hdAorbXNnaWQgIlJhdGUgZG9lc24ndCBtYXRjaCAocmVxdWVzdGVkICVpSHosIGdldCAlaUh6LCBlcnIgJWQpXG4iCittc2dzdHIgIkxhIGZyw6lxdWVuY2UgbmUgY29ycmVzcG9uZCBwYXMgKGRlbWFuZMOpZTogJWlIeiwgb2J0ZW51ZSAlaUh6LCBlcnIgJWQpXG4iCisKKyM6IC4uL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzozNTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmF0ZSBzZXQgdG8gJWlIeiAocmVxdWVzdGVkICVpSHopXG4iCittc2dzdHIgIkxhIGZyw6lxdWVuY2UgZXN0ICVpSHogKGRlbWFuZMOpZSAlaUh6KVxuIgorCisjOiAuLi9zcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6MzYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkJ1ZmZlciBzaXplIHJhbmdlIGZyb20gJWx1IHRvICVsdVxuIgorbXNnc3RyICJMJ2ludGVydmFsbGUgZGUgbGEgdGFpbGxlIGR1IHRhbXBvbiBlc3QgZGUgJWx1IMOgICVsdVxuIgorCisjOiAuLi9zcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6MzYyCisjLCBjLWZvcm1hdAorbXNnaWQgIlBlcmlvZCBzaXplIHJhbmdlIGZyb20gJWx1IHRvICVsdVxuIgorbXNnc3RyICJMJ2ludGVydmFsbGUgZGUgbGEgdGFpbGxlIGRlIGxhIHDDqXJpb2RlIGVzdCBkZSAlbHUgw6AgJWx1XG4iCisKKyM6IC4uL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzozNjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVxdWVzdGVkIHBlcmlvZCB0aW1lICV1IHVzXG4iCittc2dzdHIgIlRlbXBzIGRlIHDDqXJpb2RlIGRlbWFuZMOpICV1IMK1c1xuIgorCisjOiAuLi9zcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6MzY3CisjLCBjLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byBzZXQgcGVyaW9kIHRpbWUgJXUgdXMgZm9yIHBsYXliYWNrOiAlc1xuIgorbXNnc3RyICJMZSB0ZW1wcyBkZSBww6lyaW9kZSAldSDCtXMgbidhIHBhcyBwdSDDqnRyZSBkw6lmaW5pIHBvdXIgbGEgbGVjdHVyZTogJXNcbiIKKworIzogLi4vc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjM3MworIywgYy1mb3JtYXQKK21zZ2lkICJSZXF1ZXN0ZWQgYnVmZmVyIHRpbWUgJXUgdXNcbiIKK21zZ3N0ciAiVGVtcHMgdGFtcG9uIGRlbWFuZMOpICV1IMK1c1xuIgorCisjOiAuLi9zcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6Mzc2CisjLCBjLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byBzZXQgYnVmZmVyIHRpbWUgJXUgdXMgZm9yIHBsYXliYWNrOiAlc1xuIgorbXNnc3RyICJMZSB0ZW1wcyB0YW1wb24gZGUgJXUgwrVzIG4nYSBwYXMgcHUgw6p0cmUgZMOpZmluaWUgcG91ciBsYSBsZWN0dXJlOiAlc1xuIgorCisjOiAuLi9zcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6Mzg1CisjLCBjLWZvcm1hdAorbXNnaWQgIlVzaW5nIG1heCBidWZmZXIgc2l6ZSAlbHVcbiIKK21zZ3N0ciAiVGFpbGxlIG1heC4gZGUgdGFtcG9uICVsdSB1dGlsaXPDqWVcbiIKKworIzogLi4vc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjM4OAorIywgYy1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gc2V0IGJ1ZmZlciBzaXplICVsdSBmb3IgcGxheWJhY2s6ICVzXG4iCittc2dzdHIgIkxhIHRhaWxlIGRlIHRhbXBvbiAlbHUgbidhIHBhcyBwdSDDqnRyZSBkw6lmaW5pZSBwb3VyIGxhIGxlY3R1cmU6ICVzXG4iCisKKyM6IC4uL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzozOTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGVyaW9kcyA9ICV1XG4iCittc2dzdHIgIlDDqXJpb2RlcyA9ICV1XG4iCisKKyM6IC4uL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzozOTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIHNldCBucGVyaW9kcyAldSBmb3IgcGxheWJhY2s6ICVzXG4iCittc2dzdHIgIm5wZXJpb2RzICV1IG4nYSBwYXMgcHUgw6p0cmUgZMOpZmluaSBwb3VyIGxhIGxlY3R1cmU6ICVzXG4iCisKKyM6IC4uL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo0MDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIHNldCBodyBwYXJhbXMgZm9yIHBsYXliYWNrOiAlc1xuIgorbXNnc3RyICJMZXMgcGFyYW3DqHRyZXMgbWF0w6lyaWVsIG4nb250IHBhcyBwdSDDqnRyZSBkw6lmaW5pcyBwb3VyIGxhIGxlY3R1cmU6ICVzXG4iCisKKyM6IC4uL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo0MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAid2FzIHNldCBwZXJpb2Rfc2l6ZSA9ICVsdVxuIgorbXNnc3RyICIiCisKKyM6IC4uL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo0MTMKKyMsIGMtZm9ybWF0Cittc2dpZCAid2FzIHNldCBidWZmZXJfc2l6ZSA9ICVsdVxuIgorbXNnc3RyICIiCisKKyM6IC4uL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo0MTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiYnVmZmVyIHRvIHNtYWxsLCBjb3VsZCBub3QgdXNlXG4iCittc2dzdHIgInRhbXBvbiB0cm9wIHBldGl0LCBpbCBuJ2EgcGFzIHB1IMOqdHJlIHV0aWxpc8OpXG4iCisKKyM6IC4uL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo0MjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGRldGVybWluZSBjdXJyZW50IHN3cGFyYW1zIGZvciBwbGF5YmFjazogJXNcbiIKK21zZ3N0ciAiTGVzIHBhcmFtw6h0cmVzIGxvZ2ljaWVscyBhY3R1ZWxzIG4nb250IHBhcyBwdSDDqnRyZSBkw6l0ZXJtaW7DqXMgcG91ciBsYSBsZWN0dXJlOiAlc1xuIgorCisjOiAuLi9zcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6NDM1CisjLCBjLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byBzZXQgc3RhcnQgdGhyZXNob2xkIG1vZGUgZm9yIHBsYXliYWNrOiAlc1xuIgorbXNnc3RyICIiCisKKyM6IC4uL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo0NDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIHNldCBhdmFpbCBtaW4gZm9yIHBsYXliYWNrOiAlc1xuIgorbXNnc3RyICIiCisKKyM6IC4uL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo0NDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIHNldCBzdyBwYXJhbXMgZm9yIHBsYXliYWNrOiAlc1xuIgorbXNnc3RyICJMZXMgcGFyYW3DqHRyZXMgbG9naWNpZWwgbidvbnQgcGFzIHB1IMOqdHJlIGTDqWZpbmlzIHBvdXIgbGEgbGVjdHVyZTogJXNcbiIKKworIzogLi4vc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjQ2NAorIywgYy1mb3JtYXQKK21zZ2lkICJDYW4ndCByZWNvdmVyeSBmcm9tIHVuZGVycnVuLCBwcmVwYXJlIGZhaWxlZDogJXNcbiIKK21zZ3N0ciAiIgorCisjOiAuLi9zcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6NDc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbid0IHJlY292ZXJ5IGZyb20gc3VzcGVuZCwgcHJlcGFyZSBmYWlsZWQ6ICVzXG4iCittc2dzdHIgIiIKKworIzogLi4vc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjUzOSAuLi9zcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6OTU0CisjLCBjLWZvcm1hdAorbXNnaWQgIk5vIGVub3VnaCBtZW1vcnlcbiIKK21zZ3N0ciAiUGFzIGFzc2V6IGRlIG3DqW1vaXJlXG4iCisKKyM6IC4uL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo1NDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IG9wZW4gV0FWIGZpbGUgJXNcbiIKK21zZ3N0ciAiTGUgZmljaGllciBXQVYgJXMgbidhIHBhcyBwdSDDqnRyZSBvdXZlcnRcbiIKKworIzogLi4vc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjU0OCAuLi9zcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6NTc3CisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgV0FWIGZpbGUgJXNcbiIKK21zZ3N0ciAiRmljaGllciBXQVYgaW5jb3JyZWN0ICVzXG4iCisKKyM6IC4uL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo1NTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiTm90IGEgV0FWIGZpbGU6ICVzXG4iCittc2dzdHIgIkxlIGZpY2hpZXIgJXMgbidlc3QgcGFzIGF1IGZvcm1hdCBXQVZcbiIKKworIzogLi4vc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjU1NworIywgYy1mb3JtYXQKK21zZ2lkICJVbnN1cHBvcnRlZCBXQVYgZm9ybWF0ICVkIGZvciAlc1xuIgorbXNnc3RyICJGb3JtYXQgV0FWICVkIG5vbiBzdXBwb3J0w6kgcG91ciAlc1xuIgorCisjOiAuLi9zcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6NTYyCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGlzIG5vdCBhIG1vbm8gc3RyZWFtICglZCBjaGFubmVscylcbiIKK21zZ3N0ciAiJXMgbidlc3QgcGFzIHVuIGZsdXggZW4gbW9ubyAoJWQgY2FuYXV4KVxuIgorCisjOiAuLi9zcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6NTY3CisjLCBjLWZvcm1hdAorbXNnaWQgIlNhbXBsZSByYXRlIGRvZXNuJ3QgbWF0Y2ggKCVkKSBmb3IgJXNcbiIKK21zZ3N0ciAiTGEgZnLDqXF1ZW5jZSBkJ8OpY2hhbnRpbGxvbmFnZSAoJWQpIG5lIGNvcnJlc3BvbmQgcGFzIMOgICVzXG4iCisKKyM6IC4uL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo1NzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5zdXBwb3J0ZWQgc2FtcGxlIGZvcm1hdCBiaXRzICVkIGZvciAlc1xuIgorbXNnc3RyICJMZSBmb3JtYXQgZCfDqWNoYW50aWxsb25hZ2UgJWQgYml0cyBuJ2VzdCBwYXMgc3VwcG9ydMOpIHBvdXIgJXNcbiIKKworIzogLi4vc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjYyMgorIywgYy1mb3JtYXQKK21zZ2lkICJVbmRlZmluZWQgY2hhbm5lbCAlZFxuIgorbXNnc3RyICJDYW5hbCBub24tZMOpZmluaSAlZFxuIgorCisjOiAuLi9zcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6NjczCisjLCBjLWZvcm1hdAorbXNnaWQgIldyaXRlIGVycm9yOiAlZCwlc1xuIgorbXNnc3RyICJFcnJldXIgZW4gw6ljcml0dXJlOiAlZCwlc1xuIgorCisjOiAuLi9zcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6Njc1CisjLCBjLWZvcm1hdAorbXNnaWQgInhydW5fcmVjb3ZlcnkgZmFpbGVkOiAlZCwlc1xuIgorbXNnc3RyICIiCisKKyM6IC4uL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo3MzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlVzYWdlOiBzcGVha2VyLXRlc3QgW09QVElPTl0uLi4gXG4iCisiLWgsLS1oZWxwXHRoZWxwXG4iCisiLUQsLS1kZXZpY2VcdHBsYXliYWNrIGRldmljZVxuIgorIi1yLC0tcmF0ZVx0c3RyZWFtIHJhdGUgaW4gSHpcbiIKKyItYywtLWNoYW5uZWxzXHRjb3VudCBvZiBjaGFubmVscyBpbiBzdHJlYW1cbiIKKyItZiwtLWZyZXF1ZW5jeVx0c2luZSB3YXZlIGZyZXF1ZW5jeSBpbiBIelxuIgorIi1GLC0tZm9ybWF0XHRzYW1wbGUgZm9ybWF0XG4iCisiLWIsLS1idWZmZXJcdHJpbmcgYnVmZmVyIHNpemUgaW4gdXNcbiIKKyItcCwtLXBlcmlvZFx0cGVyaW9kIHNpemUgaW4gdXNcbiIKKyItUCwtLW5wZXJpb2RzXHRudW1iZXIgb2YgcGVyaW9kc1xuIgorIi10LC0tdGVzdFx0cGluaz11c2UgcGluayBub2lzZSwgc2luZT11c2Ugc2luZSB3YXZlLCB3YXY9V0FWIGZpbGVcbiIKKyItbCwtLW5sb29wc1x0c3BlY2lmeSBudW1iZXIgb2YgbG9vcHMgdG8gdGVzdCwgMCA9IGluZmluaXRlXG4iCisiLXMsLS1zcGVha2VyXHRzaW5nbGUgc3BlYWtlciB0ZXN0LiBWYWx1ZXMgMT1MZWZ0LCAyPXJpZ2h0LCBldGNcbiIKKyItdywtLXdhdmZpbGVcdFVzZSB0aGUgZ2l2ZW4gV0FWIGZpbGUgYXMgYSB0ZXN0IHNvdW5kXG4iCisiLVcsLS13YXZkaXJcdFNwZWNpZnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIFdBViBmaWxlc1xuIgorIlxuIgorbXNnc3RyICIiCisiVXRpbGlzYXRpb246IHNwZWFrZXItdGVzdCBbT1BUSU9OXS4uLlxuIgorIi1oLC0taGVscFx0YWlkZVxuIgorIi1ELC0tZGV2aWNlXHRww6lyaXBow6lyaXF1ZSBkZSBsZWN0dXJlXG4iCisiLXIsLS1yYXRlXHRmcsOpcXVlbmNlIGR1IGZsdXggZW4gSHpcbiIKKyItYywtLWNoYW5uZWxzXHRub21icmUgZGUgY2FuYXV4IGR1IGZsdXhcbiIKKyItZiwtLWZyZXF1ZW5jeVx0ZnLDqXF1ZW5jZSBjb3VyYmUgc2ludXMgZW4gSHpcbiIKKyItRiwtLWZvcm1hdFx0Zm9ybWF0IGQnw6ljaGFudGlsbG9uYWdlXG4iCisiLWIsLS1idWZmZXJcdHRhaWxsZSBlbiDCtXMgZHUgdGFtcG9uIGNpcmN1bGFpcmVcbiIKKyItcCwtLXBlcmlvZFx0dGFpbGxlIGRlIGxhIHDDqXJpb2RlIGVuIMK1c1xuIgorIi1QLC0tbnBlcmlvZHNcdG5vbWJyZSBkZSBww6lyaW9kZXNcbiIKKyItdCwtLXRlc3RcdHBpbms9cGluayBub2lzZSwgc2luZT1jb3VyYmUgc2ludXMsIHdhdj1maWNoaWVyIFdBVlxuIgorIi1sLC0tbmxvb3BzXHRzcMOpY2lmaWVyIGxlIG5vbWJyZSBkZSBtb3RpZnMgw6AgdGVzdGVyLCAwID0gaW5maW5pXG4iCisiLXMsLS1zcGVha2VyXHR0ZXN0IHN1ciB1bmUgc2V1bGUgZW5jZWludGUuXG4iCisiXHRcdFZhbGV1cnMgMT1HYXVjaGUsIDI9RHJvaXRlLCBldCBjLlxuIgorIi13LC0td2F2ZmlsZVx0VXRpbGlzZXIgbGUgZmljaGllciBXQVYgc3DDqWNpZmnDqSBwb3VyIGxlIHRlc3RcbiIKKyItdywtLXdhdmRpclx0U3DDqWNpZmllciBsZSByw6lwZXJ0b2lyZSBjb250ZW5hbnQgbGVzIGZpY2hpZXJzIFdBVlxuIgorIlxuIgorCisjOiAuLi9zcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6ODUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgbnVtYmVyIG9mIHBlcmlvZHMgJWRcbiIKK21zZ3N0ciAiTm9tYnJlIGRlIHDDqXJpb2RlcyAlZCBpbmNvcnJlY3RcbiIKKworIzogLi4vc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjg2NiAuLi9zcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6ODcwCisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgdGVzdCB0eXBlICVzXG4iCittc2dzdHIgIlR5cGUgZGUgdGVzdCAlcyBpbmNvcnJlY3RcbiIKKworIzogLi4vc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjg4MgorIywgYy1mb3JtYXQKK21zZ2lkICJJbnZhbGlkIHBhcmFtZXRlciBmb3IgLXMgb3B0aW9uLlxuIgorbXNnc3RyICJQYXJhbcOodHJlIGluY29ycmVjdCBwb3VyIGwnb3B0aW9uIC1zLlxuIgorCisjOiAuLi9zcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6ODk2CisjLCBjLWZvcm1hdAorbXNnaWQgIlVua25vd24gb3B0aW9uICclYydcbiIKK21zZ3N0ciAiT3B0aW9uICclYycgaW5jb25udWVcbiIKKworIy4gZml4ZWQgZm9ybWF0CisjOiAuLi9zcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6OTEwCisjLCBjLWZvcm1hdAorbXNnaWQgIlBsYXliYWNrIGRldmljZSBpcyAlc1xuIgorbXNnc3RyICJMZSBww6lyaXBow6lyaXF1ZSBkZSBsZWN0dXJlIGVzdCAlc1xuIgorCisjOiAuLi9zcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6OTExCisjLCBjLWZvcm1hdAorbXNnaWQgIlN0cmVhbSBwYXJhbWV0ZXJzIGFyZSAlaUh6LCAlcywgJWkgY2hhbm5lbHNcbiIKK21zZ3N0ciAiTGVzIHBhcmFtw6h0cmVzIGR1IGZsdXggc29udCAlaUh6LCAlcywgJWkgY2FuYXV4XG4iCisKKyM6IC4uL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo5MTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiVXNpbmcgMTYgb2N0YXZlcyBvZiBwaW5rIG5vaXNlXG4iCittc2dzdHIgIlV0aWxpc2F0aW9uIGRlIDE2IG9jdGF2ZXMgZGUgJ3Bpbmsgbm9pc2UnXG4iCisKKyM6IC4uL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo5MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2luZSB3YXZlIHJhdGUgaXMgJS40Zkh6XG4iCittc2dzdHIgIkxhIGZyw6lxdWVuY2UgZGUgbGEgY291cmJlIHNpbnVzIGVzdCAlLjRmSHpcbiIKKworIzogLi4vc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjkyMAorIywgYy1mb3JtYXQKK21zZ2lkICJXQVYgZmlsZShzKVxuIgorbXNnc3RyICJmaWNoaWVyKHMpIFdBVlxuIgorCisjOiAuLi9zcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6OTI2CisjLCBjLWZvcm1hdAorbXNnaWQgIlBsYXliYWNrIG9wZW4gZXJyb3I6ICVkLCVzXG4iCittc2dzdHIgIkVycmV1ciBkJ291dmVydHVyZSDDoCBsYSBsZWN0dXJlOiAlZCwlc1xuIgorCisjOiAuLi9zcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6OTMxCisjLCBjLWZvcm1hdAorbXNnaWQgIlNldHRpbmcgb2YgaHdwYXJhbXMgZmFpbGVkOiAlc1xuIgorbXNnc3RyICLDiWNoZWMgZGUgbGEgY29uZmlndXJhdGlvbiBkZXMgcGFyYW3DqHRyZXMgbWF0w6lyaWVsOiAlc1xuIgorCisjOiAuLi9zcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6OTM2CisjLCBjLWZvcm1hdAorbXNnaWQgIlNldHRpbmcgb2Ygc3dwYXJhbXMgZmFpbGVkOiAlc1xuIgorbXNnc3RyICLDiWNoZWMgZGUgbGEgY29uZmlndXJhdGlvbiBkZXMgcGFyYW3DqHRyZXMgbG9naWNpZWw6ICVzXG4iCisKKyM6IC4uL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo5ODUgLi4vc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjEwMDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiVHJhbnNmZXIgZmFpbGVkOiAlc1xuIgorbXNnc3RyICLDiWNoZWMgZHUgdHJhbnNmZXI6ICVzXG4iCisKKyM6IC4uL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo5OTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGltZSBwZXIgcGVyaW9kID0gJWxmXG4iCittc2dzdHIgIlRlbXBzIHBhciBww6lyaW9kZSA9ICVsZlxuIgpkaWZmIC0tZ2l0IGEvcG8vamEucG8gYi9wby9qYS5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzIzNGY0Ci0tLSAvZGV2L251bGwKKysrIGIvcG8vamEucG8KQEAgLTAsMCArMSwxNTIwIEBACisjIEphcGFuZXNlIHRyYW5zbGF0aW9ucyBmb3IgYWxzYS11dGlscyBwYWNrYWdlCisjIGFsc2EtdXRpbHMg44OR44OD44Kx44O844K444Gr5a++44GZ44KL6Iux6KizLgorIyBDb3B5cmlnaHQgKEMpIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSBhbHNhLXV0aWxzIHBhY2thZ2UuCisjIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4sIDIwMDUuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBhbHNhLXV0aWxzIDEuMC45YVxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBcbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAwOS0wNS0yNCAxOTo1NiswMjAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAwOS0wNS0yNyAxNTowOCswMjAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+XG4iCisiTGFuZ3VhZ2UtVGVhbTogSmFwYW5lc2VcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTE7IHBsdXJhbD0wO1xuIgorCisjOiBhbHNhbWl4ZXIvY2FyZF9zZWxlY3QuYzoxMjYgYWxzYW1peGVyL2RldmljZV9uYW1lLmM6MTI2Cittc2dpZCAiU291bmQgQ2FyZCIKK21zZ3N0ciAi44K144Km44Oz44OJ44Kr44O844OJIgorCisjOiBhbHNhbWl4ZXIvY2FyZF9zZWxlY3QuYzoxODEKK21zZ2lkICIoZGVmYXVsdCkiCittc2dzdHIgIijjg4fjg5Xjgqnjg6vjg4gpIgorCisjOiBhbHNhbWl4ZXIvY2FyZF9zZWxlY3QuYzoxOTEKK21zZ2lkICJjYW5ub3QgZW51bWVyYXRlIHNvdW5kIGNhcmRzIgorbXNnc3RyICLjgrXjgqbjg7Pjg4njgqvjg7zjg4njgpLmpJzlh7rjgafjgY3jgb7jgZvjgpMiCisKKyM6IGFsc2FtaXhlci9jYXJkX3NlbGVjdC5jOjIxNQorbXNnaWQgImVudGVyIGRldmljZSBuYW1lLi4uIgorbXNnc3RyICLjg4fjg5DjgqTjgrnlkI3lhaXlipsuLi4iCisKKyM6IGFsc2FtaXhlci9jbGkuYzo0MAorbXNnaWQgIlVzYWdlOiBhbHNhbWl4ZXIgW29wdGlvbnNdIgorbXNnc3RyICLkvb/nlKjms5U6IGFsc2FtaXhlciBb44Kq44OX44K344On44OzXSIKKworIzogYWxzYW1peGVyL2NsaS5jOjQxCittc2dpZCAiIgorIlVzZWZ1bCBvcHRpb25zOlxuIgorIiAgLWgsIC0taGVscCAgICAgICAgICAgICAgdGhpcyBoZWxwXG4iCisiICAtYywgLS1jYXJkPU5VTUJFUiAgICAgICBzb3VuZCBjYXJkIG51bWJlciBvciBpZFxuIgorIiAgLUQsIC0tZGV2aWNlPU5BTUUgICAgICAgbWl4ZXIgZGV2aWNlIG5hbWVcbiIKKyIgIC1WLCAtLXZpZXc9TU9ERSAgICAgICAgIHN0YXJ0aW5nIHZpZXcgbW9kZTogcGxheWJhY2svY2FwdHVyZS9hbGwiCittc2dzdHIgIiIKKyLkuLvjgarjgqrjg5fjgrfjg6fjg7M6XG4iCisiICAtaCwgLS1oZWxwICAgICAgICAgICAgICAg44GT44Gu44OY44Or44OX55S76Z2iXG4iCisiICAtYywgLS1jYXJkPeeVquWPtyAgICAgICAgICDjgrXjgqbjg7Pjg4njgqvjg7zjg4nnlarlj7fjgb7jgZ/jga9JRFxuIgorIiAgLUQsIC0tZGV2aWNlPeWQjeWJjSAgICAgICAg44Of44Kt44K144O844OH44OQ44Kk44K55ZCNXG4iCisiICAtViwgLS12aWV3PeihqOekuuODouODvOODiSAgICDplovlp4vmmYLjga7ooajnpLrjg6Ljg7zjg4k6IHBsYXliYWNrL2NhcHR1cmUvYWxsIgorCisjOiBhbHNhbWl4ZXIvY2xpLmM6NDYKK21zZ2lkICIiCisiRGVidWdnaW5nIG9wdGlvbnM6XG4iCisiICAtZywgLS1uby1jb2xvciAgICAgICAgICB0b2dnbGUgdXNpbmcgb2YgY29sb3JzXG4iCisiICAtYSwgLS1hYnN0cmFjdGlvbj1OQU1FICBtaXhlciBhYnN0cmFjdGlvbiBsZXZlbDogbm9uZS9iYXNpYyIKK21zZ3N0ciAiIgorIuODh+ODkOODg+OCsOOCquODl+OCt+ODp+ODszpcbiIKKyIgIC1nLCAtLW5vLWNvbG9yICAgICAgICAgICDjgqvjg6njg7wv44Oi44OO44Kv44Ot6KGo56S6XG4iCisiICAtYSwgLS1hYnN0cmFjdGlvbj3lkI3liY0gICDjg5/jgq3jgrXjg7zmir3osaHjg6zjg5njg6s6IG5vbmUvYmFzaWMiCisKKyM6IGFsc2FtaXhlci9jbGkuYzo3NworIywgYy1mb3JtYXQKK21zZ2lkICJpbnZhbGlkIGNhcmQgaW5kZXg6ICVzXG4iCittc2dzdHIgIuS4jeato+OBquOCq+ODvOODieeVquWPtzogJXNcbiIKKworIzogYWxzYW1peGVyL2NsaS5jOjEwMworIywgYy1mb3JtYXQKK21zZ2lkICJ1bmtub3duIGFic3RyYWN0aW9uIGxldmVsOiAlc1xuIgorbXNnc3RyICLmnKrnn6Xjga7mir3osaHjg6zjg5njg6s6ICVzXG4iCisKKyM6IGFsc2FtaXhlci9jbGkuYzoxMDgKKyMsIGMtZm9ybWF0Cittc2dpZCAidW5rbm93biBvcHRpb246ICVjXG4iCittc2dzdHIgIuacquefpeOBruOCquODl+OCt+ODp+ODsyAnJWMnXG4iCisKKyM6IGFsc2FtaXhlci9jbGkuYzoxMTAKK21zZ2lkICJ0cnkgYGFsc2FtaXhlciAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uXG4iCittc2dzdHIgIuOCiOOCiuips+OBl+OBhOaDheWgseOBr+OAjGFsc2FtaXhlciAtLWhlbHDjgI3jgpLlrp/ooYzjgZfjgabjgY/jgaDjgZXjgYRcbiIKKworIzogYWxzYW1peGVyL2RldmljZV9uYW1lLmM6MTc3Cittc2dpZCAiRGV2aWNlIG5hbWU6IgorbXNnc3RyICLjg4fjg5DjgqTjgrnlkI06IgorCisjOiBhbHNhbWl4ZXIvZGllLmM6MzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6ICVzXG4iCittc2dzdHIgIiIKKworIzogYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzo5NQorbXNnaWQgIkNhcmQ6IgorbXNnc3RyICLjgqvjg7zjg4k6IgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjk2Cittc2dpZCAiQ2hpcDoiCittc2dzdHIgIuODgeODg+ODlzoiCisKKyM6IGFsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6OTcKK21zZ2lkICJWaWV3OiIKK21zZ3N0ciAi6KGo56S6OiIKKworIzogYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzo5OAorbXNnaWQgIkl0ZW06IgorbXNnc3RyICLpoIXnm646IgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjEwMQorbXNnaWQgIkYxOiAgSGVscCIKK21zZ3N0ciAiRjE6ICDjg5jjg6vjg5ciCisKKyM6IGFsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6MTAyCittc2dpZCAiRjI6ICBTeXN0ZW0gaW5mb3JtYXRpb24iCittc2dzdHIgIkYyOiAg44K344K544OG44Og5oOF5aCxIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjEwMworbXNnaWQgIkY2OiAgU2VsZWN0IHNvdW5kIGNhcmQiCittc2dzdHIgIkY2OiAg44K144Km44Oz44OJ44Kr44O844OJ6YG45oqeIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjEwNAorbXNnaWQgIkVzYzogRXhpdCIKK21zZ3N0ciAiRXNjOiDntYLkuoYiCisKKyM6IGFsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6MTcxCittc2dpZCAiKHVucGx1Z2dlZCkiCittc2dzdHIgIiIKKworIzogYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzoxODkKK21zZ2lkICJQbGF5YmFjayIKK21zZ3N0ciAi5YaN55SfIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjE5MAorbXNnaWQgIkNhcHR1cmUiCittc2dzdHIgIumMsumfsyIKKworIzogYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzoxOTEKK21zZ2lkICJBbGwiCittc2dzdHIgIuWFqOOBpiIKKworIzogYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzoyMzEKK21zZ2lkICJtdXRlIgorbXNnc3RyICLjg5/jg6Xjg7zjg4giCisKKyM6IGFsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6MjcyIGFsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6MjgyCittc2dpZCAiZEIgZ2FpbjoiCittc2dzdHIgImRC44Ky44Kk44OzOiIKKworIzogYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzoyODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiIFslcyAlcywgJXNdIgorbXNnc3RyICIiCisKKyM6IGFsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6MjkxIGFsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6Mjk3CisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjMwMyBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjMwOQorbXNnaWQgIk9mZiIKK21zZ3N0ciAi44Kq44OVIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjI5NyBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjMwOQorbXNnaWQgIk9uIgorbXNnc3RyICLjgqrjg7MiCisKKyM6IGFsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6MzYwCittc2dpZCAiVGhlIHNvdW5kIGRldmljZSB3YXMgdW5wbHVnZ2VkLiIKK21zZ3N0ciAi44OH44OQ44Kk44K544GM5o6l57aa44GV44KM44Gm44GE44G+44Gb44KTIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjM2MQorbXNnaWQgIlByZXNzIEY2IHRvIHNlbGVjdCBhbm90aGVyIHNvdW5kIGNhcmQuIgorbXNnc3RyICLku5bjga7jgqvjg7zjg4njgpLpgbjmip7jgZnjgovjgavjga9GNuOCkuaKvOOBl+OBpuS4i+OBleOBhCIKKworIzogYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzozNzYKK21zZ2lkICJUaGlzIHNvdW5kIGRldmljZSBkb2VzIG5vdCBoYXZlIGFueSBwbGF5YmFjayBjb250cm9scy4iCittc2dzdHIgIuOBk+OBruOCq+ODvOODieOBq+OBr+WGjeeUn+ODn+OCreOCteODvOOBjOOBguOCiuOBvuOBm+OCkyIKKworIzogYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzozNzgKK21zZ2lkICJUaGlzIHNvdW5kIGRldmljZSBkb2VzIG5vdCBoYXZlIGFueSBjYXB0dXJlIGNvbnRyb2xzLiIKK21zZ3N0ciAi44GT44Gu44Kr44O844OJ44Gr44Gv6Yyy6Z+z44Of44Kt44K144O844GM44GC44KK44G+44Gb44KTIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjM4MAorbXNnaWQgIlRoaXMgc291bmQgZGV2aWNlIGRvZXMgbm90IGhhdmUgYW55IGNvbnRyb2xzLiIKK21zZ3N0ciAi44GT44Gu44Kr44O844OJ44Gr44Gv5Yi25b6h5Y+v6IO944Gq44Of44Kt44K144O844GM44GC44KK44G+44Gb44KTIgorCisjLiBUUkFOU0xBVE9SUzogcGxheWJhY2sgb247IG9uZSBjaGFyYWN0ZXIKKyM6IGFsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6NTEyIGFsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6NTE3Cittc2dpZCAiTyIKK21zZ3N0ciAiIgorCisjLiBUUkFOU0xBVE9SUzogcGxheWJhY2sgbXV0ZWQ7IG9uZSBjaGFyYWN0ZXIKKyM6IGFsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6NTE0IGFsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6NTE4Cittc2dpZCAiTSIKK21zZ3N0ciAiIgorCisjLiBUUkFOU0xBVE9SUzogImxlZnQiOyBubyBtb3JlIHRoYW4gdHdvIGNoYXJhY3RlcnMKKyM6IGFsc2FtaXhlci9taXhlcl9kaXNwbGF5LmM6NTMyCittc2dpZCAiTCIKK21zZ3N0ciAiIgorCisjLiBUUkFOU0xBVE9SUzogInJpZ2h0Ijsgbm8gbW9yZSB0aGFuIHR3byBjaGFyYWN0ZXJzCisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjUzNgorbXNnaWQgIlIiCittc2dzdHIgIiIKKworIy4gVFJBTlNMQVRPUlM6IG5vIG1vcmUgdGhhbiBlaWdodCBjaGFyYWN0ZXJzCisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjUzOAorbXNnaWQgIkNBUFRVUkUiCittc2dzdHIgIumMsumfsyIKKworIzogYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzo1ODgKK21zZ2lkICJGcm9udCIKK21zZ3N0ciAi44OV44Ot44Oz44OIIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjU5MQorbXNnaWQgIlJlYXIiCittc2dzdHIgIuODquOCoiIKKworIzogYWxzYW1peGVyL21peGVyX2Rpc3BsYXkuYzo1OTQgc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjEwNgorbXNnaWQgIkNlbnRlciIKK21zZ3N0ciAi44K744Oz44K/44O8IgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjU5NworbXNnaWQgIldvb2ZlciIKK21zZ3N0ciAi5L2O6Z+zIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfZGlzcGxheS5jOjYwMAorbXNnaWQgIlNpZGUiCittc2dzdHIgIuOCteOCpOODiSIKKworIzogYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjgzIGFsc2FtaXhlci9taXhlcl93aWRnZXQuYzo4OAorbXNnaWQgImNhbm5vdCBvcGVuIG1peGVyIgorbXNnc3RyICLjg5/jgq3jgrXjg7zjgpLplovjgZHjgb7jgZvjgpMiCisKKyM6IGFsc2FtaXhlci9taXhlcl93aWRnZXQuYzo5NCBhbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MTcxCittc2dpZCAiY2Fubm90IGxvYWQgbWl4ZXIgY29udHJvbHMiCittc2dzdHIgIuODn+OCreOCteODvOOCkuODreODvOODieOBp+OBjeOBvuOBm+OCkyIKKworIzogYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjE2MQorIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3Qgb3BlbiBtaXhlciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIuODn+OCreOCteODvOODh+ODkOOCpOOCuSclcyfjgpLplovjgZHjgb7jgZvjgpMiCisKKyM6IGFsc2FtaXhlci9taXhlcl93aWRnZXQuYzoxODIKK21zZ2lkICJFc2MgICAgIEV4aXQiCittc2dzdHIgIkVzYyAgICDntYLkuoYiCisKKyM6IGFsc2FtaXhlci9taXhlcl93aWRnZXQuYzoxODMKK21zZ2lkICJGMSA/IEggIEhlbHAiCittc2dzdHIgIkYxID8gICBIIOODmOODq+ODlyIKKworIzogYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjE4NAorbXNnaWQgIkYyIC8gICAgU3lzdGVtIGluZm9ybWF0aW9uIgorbXNnc3RyICJGMiAvICAg44K344K544OG44Og5oOF5aCxIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MTg1Cittc2dpZCAiRjMgICAgICBTaG93IHBsYXliYWNrIGNvbnRyb2xzIgorbXNnc3RyICJGMyAgICAg5YaN55Sf44Of44Kt44K144O86KGo56S6IgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MTg2Cittc2dpZCAiRjQgICAgICBTaG93IGNhcHR1cmUgY29udHJvbHMiCittc2dzdHIgIkY0ICAgICDpjLLpn7Pjg5/jgq3jgrXjg7zooajnpLoiCisKKyM6IGFsc2FtaXhlci9taXhlcl93aWRnZXQuYzoxODcKK21zZ2lkICJGNSAgICAgIFNob3cgYWxsIGNvbnRyb2xzIgorbXNnc3RyICJGNSAgICAg5YWo44Gm6KGo56S6IgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MTg4Cittc2dpZCAiVGFiICAgICBUb2dnbGUgdmlldyBtb2RlIChGMy9GNC9GNSkiCittc2dzdHIgIlRhYiAgICDooajnpLrjg6Ljg7zjg4nlpInmm7QgKEYzL0Y0L0Y1KSIKKworIzogYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjE4OQorbXNnaWQgIkY2IFMgICAgU2VsZWN0IHNvdW5kIGNhcmQiCittc2dzdHIgIkY1IFMgICDjgrXjgqbjg7Pjg4njgqvjg7zjg4npgbjmip4iCisKKyM6IGFsc2FtaXhlci9taXhlcl93aWRnZXQuYzoxOTAKK21zZ2lkICJMICAgICAgIFJlZHJhdyBzY3JlZW4iCittc2dzdHIgIkwgICAgICDnlLvpnaLlho3mj4/nlLsiCisKKyM6IGFsc2FtaXhlci9taXhlcl93aWRnZXQuYzoxOTIKK21zZ2lkICJMZWZ0ICAgIE1vdmUgdG8gdGhlIHByZXZpb3VzIGNvbnRyb2wiCittc2dzdHIgIuKGkCAgICAg5YmN44Gu6aCF55uu44Gr56e744KLIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MTkzCittc2dpZCAiUmlnaHQgICBNb3ZlIHRvIHRoZSBuZXh0IGNvbnRyb2wiCittc2dzdHIgIuKGkiAgICAg5qyh44Gu6aCF55uu44Gr56e744KLIgorCisjIOKGkQorIzogYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjE5NQorbXNnaWQgIlVwL0Rvd24gICAgQ2hhbmdlIHZvbHVtZSIKK21zZ3N0ciAi4oaRL+KGkyAgICAg6Z+z6YeP5aSJ5pu0IgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MTk2Cittc2dpZCAiKyAtICAgICAgICBDaGFuZ2Ugdm9sdW1lIgorbXNnc3RyICIrIC0gICAgICAg6Z+z6YeP5aSJ5pu0IgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MTk3Cittc2dpZCAiUGFnZSBVcC9EbiBDaGFuZ2Ugdm9sdW1lIGluIGJpZyBzdGVwcyIKK21zZ3N0ciAiUGFnZSBVcC9kbiDpn7Pph4/lpInmm7QiCisKKyM6IGFsc2FtaXhlci9taXhlcl93aWRnZXQuYzoxOTgKK21zZ2lkICJFbmQgICAgICAgIFNldCB2b2x1bWUgdG8gMCUiCittc2dzdHIgIkVuZCAgICAgICDpn7Pph48gMCUiCisKKyM6IGFsc2FtaXhlci9taXhlcl93aWRnZXQuYzoxOTkKK21zZ2lkICIwLTkgICAgICAgIFNldCB2b2x1bWUgdG8gMCUtOTAlIgorbXNnc3RyICIwLTkgICAgICAg6Z+z6YePIDAlLTkwJSIKKworIzogYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjIwMAorbXNnaWQgIlEgVyBFICAgICAgSW5jcmVhc2UgbGVmdC9ib3RoL3JpZ2h0IHZvbHVtZXMiCittc2dzdHIgIlEgVyBFICAgICDlt6Yv5LihL+WPs+mfs+mHj+OCouODg+ODlyIKKworIy4gVFJBTlNMQVRPUlM6IG9yIFkgaW5zdGVhZCBvZiBaCisjOiBhbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MjAyCittc2dpZCAiWiBYIEMgICAgICBEZWNyZWFzZSBsZWZ0L2JvdGgvcmlnaHQgdm9sdW1lcyIKK21zZ3N0ciAiWiBYIEMgICAgIOW3pi/kuKEv5Y+z6Z+z6YeP44OA44Km44OzIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MjAzCittc2dpZCAiQiAgICAgICAgICBCYWxhbmNlIGxlZnQgYW5kIHJpZ2h0IHZvbHVtZXMiCittc2dzdHIgIkIgICAgICAgICDlt6blj7Ppn7Pph4/jgpLlubPlnYfljJbjgZnjgosiCisKKyM6IGFsc2FtaXhlci9taXhlcl93aWRnZXQuYzoyMDUKK21zZ2lkICJNICAgICAgICAgIFRvZ2dsZSBtdXRlIgorbXNnc3RyICJNICAgICAgICAg44Of44Ol44O844OI44KS44OI44Kw44OrIgorCisjLiBUUkFOU0xBVE9SUzogb3IgLCAuCisjOiBhbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MjA3Cittc2dpZCAiPCA+ICAgICAgICBUb2dnbGUgbGVmdC9yaWdodCBtdXRlIgorbXNnc3RyICI8ID4gICAgICAg5bemL+WPs+ODn+ODpeODvOODiOOCkuODiOOCsOODqyIKKworIzogYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjIwOQorbXNnaWQgIlNwYWNlICAgICAgVG9nZ2xlIGNhcHR1cmUiCittc2dzdHIgIuOCueODmuODvOOCuSAg6Yyy6Z+z44KS44OI44Kw44OrIgorCisjLiBUUkFOU0xBVE9SUzogb3IgSW5zZXJ0IERlbGV0ZQorIzogYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjIxMQorbXNnaWQgIjsgJyAgICAgICAgVG9nZ2xlIGxlZnQvcmlnaHQgY2FwdHVyZSIKK21zZ3N0ciAiOyAnICAgICAgIOW3pi/lj7PpjLLpn7PjgpLjg4jjgrDjg6siCisKKyM6IGFsc2FtaXhlci9taXhlcl93aWRnZXQuYzoyMTMKK21zZ2lkICJBdXRob3JzOiIKK21zZ3N0ciAi5L2c6ICFOiIKKworIzogYWxzYW1peGVyL21peGVyX3dpZGdldC5jOjIxNAorbXNnaWQgIiAgVGltIEphbmlrIDx0aW1qQGd0ay5vcmc+IgorbXNnc3RyICIiCisKKyM6IGFsc2FtaXhlci9taXhlcl93aWRnZXQuYzoyMTUKK21zZ2lkICIgIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+IgorbXNnc3RyICIiCisKKyM6IGFsc2FtaXhlci9taXhlcl93aWRnZXQuYzoyMTYKK21zZ2lkICIgIENsZW1lbnMgTGFkaXNjaCA8Y2xlbWVuc0BsYWRpc2NoLmRlPiIKK21zZ3N0ciAiIgorCisjOiBhbHNhbWl4ZXIvbWl4ZXJfd2lkZ2V0LmM6MjE4Cittc2dpZCAiSGVscCIKK21zZ3N0ciAi44OY44Or44OXIgorCisjOiBhbHNhbWl4ZXIvcHJvY19maWxlcy5jOjEwMworbXNnaWQgIlNlbGVjdCBGaWxlIgorbXNnc3RyICLjg5XjgqHjgqTjg6vpgbjmip4iCisKKyM6IGFsc2FtaXhlci90ZXh0Ym94LmM6NTIgYWxzYW1peGVyL3RleHRib3guYzo2NgorbXNnaWQgIkVycm9yIgorbXNnc3RyICLjgqjjg6njg7wiCisKKyM6IGFsc2FtaXhlci90ZXh0Ym94LmM6ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IG9wZW4gZmlsZSBcIiVzXCIuIgorbXNnc3RyICJcIiVzXCLjgpLjgqrjg7zjg5fjg7PjgafjgY3jgb7jgZvjgpMiCisKKyM6IGFwbGF5L2FwbGF5LmM6MTM5Cittc2dpZCAicmF3IGRhdGEiCittc2dzdHIgInJhdyDjg4fjg7zjgr8iCisKKyM6IGFwbGF5L2FwbGF5LmM6MTQwCittc2dpZCAiVk9DIgorbXNnc3RyICJWT0MiCisKKyM6IGFwbGF5L2FwbGF5LmM6MTQyCittc2dpZCAiV0FWRSIKK21zZ3N0ciAiV0FWRSIKKworIzogYXBsYXkvYXBsYXkuYzoxNDMKK21zZ2lkICJTcGFyYyBBdWRpbyIKK21zZ3N0ciAiU3BhcmMg44Kq44O844OH44Kj44KqIgorCisjOiBhcGxheS9hcGxheS5jOjE2NAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiVXNhZ2U6ICVzIFtPUFRJT05dLi4uIFtGSUxFXS4uLlxuIgorIlxuIgorIi1oLCAtLWhlbHAgICAgICAgICAgICAgIGhlbHBcbiIKKyIgICAgLS12ZXJzaW9uICAgICAgICAgICBwcmludCBjdXJyZW50IHZlcnNpb25cbiIKKyItbCwgLS1saXN0LWRldmljZXMgICAgICBsaXN0IGFsbCBzb3VuZGNhcmRzIGFuZCBkaWdpdGFsIGF1ZGlvIGRldmljZXNcbiIKKyItTCwgLS1saXN0LXBjbXMgICAgICAgICBsaXN0IGRldmljZSBuYW1lc1xuIgorIi1ELCAtLWRldmljZT1OQU1FICAgICAgIHNlbGVjdCBQQ00gYnkgbmFtZVxuIgorIi1xLCAtLXF1aWV0ICAgICAgICAgICAgIHF1aWV0IG1vZGVcbiIKKyItdCwgLS1maWxlLXR5cGUgVFlQRSAgICBmaWxlIHR5cGUgKHZvYywgd2F2LCByYXcgb3IgYXUpXG4iCisiLWMsIC0tY2hhbm5lbHM9IyAgICAgICAgY2hhbm5lbHNcbiIKKyItZiwgLS1mb3JtYXQ9Rk9STUFUICAgICBzYW1wbGUgZm9ybWF0IChjYXNlIGluc2Vuc2l0aXZlKVxuIgorIi1yLCAtLXJhdGU9IyAgICAgICAgICAgIHNhbXBsZSByYXRlXG4iCisiLWQsIC0tZHVyYXRpb249IyAgICAgICAgaW50ZXJydXB0IGFmdGVyICMgc2Vjb25kc1xuIgorIi1NLCAtLW1tYXAgICAgICAgICAgICAgIG1tYXAgc3RyZWFtXG4iCisiLU4sIC0tbm9uYmxvY2sgICAgICAgICAgbm9uYmxvY2tpbmcgbW9kZVxuIgorIi1GLCAtLXBlcmlvZC10aW1lPSMgICAgIGRpc3RhbmNlIGJldHdlZW4gaW50ZXJydXB0cyBpcyAjIG1pY3Jvc2Vjb25kc1xuIgorIi1CLCAtLWJ1ZmZlci10aW1lPSMgICAgIGJ1ZmZlciBkdXJhdGlvbiBpcyAjIG1pY3Jvc2Vjb25kc1xuIgorIiAgICAtLXBlcmlvZC1zaXplPSMgICAgIGRpc3RhbmNlIGJldHdlZW4gaW50ZXJydXB0cyBpcyAjIGZyYW1lc1xuIgorIiAgICAtLWJ1ZmZlci1zaXplPSMgICAgIGJ1ZmZlciBkdXJhdGlvbiBpcyAjIGZyYW1lc1xuIgorIi1BLCAtLWF2YWlsLW1pbj0jICAgICAgIG1pbiBhdmFpbGFibGUgc3BhY2UgZm9yIHdha2V1cCBpcyAjIG1pY3Jvc2Vjb25kc1xuIgorIi1SLCAtLXN0YXJ0LWRlbGF5PSMgICAgIGRlbGF5IGZvciBhdXRvbWF0aWMgUENNIHN0YXJ0IGlzICMgbWljcm9zZWNvbmRzIFxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgIChyZWxhdGl2ZSB0byBidWZmZXIgc2l6ZSBpZiA8PSAwKVxuIgorIi1ULCAtLXN0b3AtZGVsYXk9IyAgICAgIGRlbGF5IGZvciBhdXRvbWF0aWMgUENNIHN0b3AgaXMgIyBtaWNyb3NlY29uZHMgZnJvbSAiCisieHJ1blxuIgorIi12LCAtLXZlcmJvc2UgICAgICAgICAgIHNob3cgUENNIHN0cnVjdHVyZSBhbmQgc2V0dXAgKGFjY3VtdWxhdGl2ZSlcbiIKKyItViwgLS12dW1ldGVyPVRZUEUgICAgICBlbmFibGUgVlUgbWV0ZXIgKFRZUEU6IG1vbm8gb3Igc3RlcmVvKVxuIgorIi1JLCAtLXNlcGFyYXRlLWNoYW5uZWxzIG9uZSBmaWxlIGZvciBlYWNoIGNoYW5uZWxcbiIKKyIgICAgLS1kaXNhYmxlLXJlc2FtcGxlICBkaXNhYmxlIGF1dG9tYXRpYyByYXRlIHJlc2FtcGxlXG4iCisiICAgIC0tZGlzYWJsZS1jaGFubmVscyAgZGlzYWJsZSBhdXRvbWF0aWMgY2hhbm5lbCBjb252ZXJzaW9uc1xuIgorIiAgICAtLWRpc2FibGUtZm9ybWF0ICAgIGRpc2FibGUgYXV0b21hdGljIGZvcm1hdCBjb252ZXJzaW9uc1xuIgorIiAgICAtLWRpc2FibGUtc29mdHZvbCAgIGRpc2FibGUgc29mdHdhcmUgdm9sdW1lIGNvbnRyb2wgKHNvZnR2b2wpXG4iCisiICAgIC0tdGVzdC1wb3NpdGlvbiAgICAgdGVzdCByaW5nIGJ1ZmZlciBwb3NpdGlvblxuIgorIiAgICAtLXRlc3QtY29lZj0jXHQgdGVzdCBjb2VmaWNpZW50IGZvciByaW5nIGJ1ZmZlciBwb3NpdGlvbiAoZGVmYXVsdCA4KVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gZm9yIHZhbGlkYXRpb24gaXM6IGNvZWYgKiAoYnVmZmVyX3NpemUgLyAiCisiMilcbiIKKyIgICAgLS10ZXN0LW5vd2FpdCAgICAgICBkbyBub3Qgd2FpdCBmb3IgcmluZyBidWZmZXIgLSBlYXRzIHdob2xlIENQVVxuIgorbXNnc3RyICIiCisi5L2/55So5rOVOiAlcyBb44Kq44OX44K344On44OzXS4uLiBb44OV44Kh44Kk44OrXS4uLlxuIgorIlxuIgorIi1oLCAtLWhlbHAgICAgICAgICAgICAgIOODmOODq+ODl1xuIgorIiAgICAtLXZlcnNpb24gICAgICAgICAgIOePvuWcqOOBruODkOODvOOCuOODp+ODs+OCkuihqOekulxuIgorIi1sLCAtLWxpc3QtZGV2aWNlcyAgICAgIOWFqOOBpuOBruOCteOCpuODs+ODieOCq+ODvOODieOBqOOCquODvOODh+OCo+OCquODh+ODkOOCpOOCueOCkuihqOekulxuIgorIi1MLCAtLWxpc3QtcGNtcyAgICAgICAgIOWFqOOBpuOBruWumue+qeOBleOCjOOBnyBQQ00g44KS6KGo56S6XG4iCisiLUQsIC0tZGV2aWNlPU5BTUUgICAgICAg5L2/55So44GZ44KLIFBDTSDjgpLmjIflrppcbiIKKyItcSwgLS1xdWlldCAgICAgICAgICAgICBxdWlldCDjg6Ljg7zjg4lcbiIKKyItdCwgLS1maWxlLXR5cGUgVFlQRSAgICDjg5XjgqHjgqTjg6vjgr/jgqTjg5cgKHZvYywgd2F2LCByYXcg44G+44Gf44GvIGF1KVxuIgorIi1jLCAtLWNoYW5uZWxzPSMgICAgICAgIOODgeODo+ODjeODq+aVsFxuIgorIi1mLCAtLWZvcm1hdD1GT1JNQVQgICAgIOOCteODs+ODl+ODq+ODleOCqeODvOODnuODg+ODiCAo5aSn77yP5bCP5paH5a2X5Yy65YilKVxuIgorIi1yLCAtLXJhdGU9IyAgICAgICAgICAgIOOCteODs+ODl+ODq+ODrOODvOODiFxuIgorIi1kLCAtLWR1cmF0aW9uPSMgICAgICAgIOaMh+WumuOBruenkuaVsOW+jOOBq+e1guS6hlxuIgorIi1NLCAtLW1tYXAgICAgICAgICAgICAgIG1tYXAg44K544OI44Oq44O844OgXG4iCisiLU4sIC0tbm9uYmxvY2sgICAgICAgICAg6Z2e44OW44Ot44OD44Kv44Oi44O844OJXG4iCisiLUYsIC0tcGVyaW9kLXRpbWU9IyAgICAg5Ymy44KK6L6844G/6ZaT6ZqU44KSzrznp5LjgafmjIflrppcbiIKKyItQiwgLS1idWZmZXItdGltZT0jICAgICDjg5Djg4Pjg5XjgqHjga7lpKfjgY3jgZXjgpLOvOenkuOBp+aMh+WumlxuIgorIiAgICAtLXBlcmlvZC1zaXplPSMgICAgIOWJsuOCiui+vOOBv+mWk+malOOCkuODleODrOODvOODoOaVsOOBp+aMh+WumlxuIgorIiAgICAtLWJ1ZmZlci1zaXplPSMgICAgIOODkOODg+ODleOCoeOBruWkp+OBjeOBleOCkuODleODrOODvOODoOaVsOOBp+aMh+WumlxuIgorIi1BLCAtLWF2YWlsLW1pbj0jICAgICAgIHdha2V1cCDjga7mnIDlsJHjgrnjg5rjg7zjgrnjgpLOvOenkuOBp+aMh+WumlxuIgorIi1SLCAtLXN0YXJ0LWRlbGF5PSMgICAgIOaMh+WumuOBrs6856eS5b6M44GrIFBDTSDjgpLoh6rli5Xjgrnjgr/jg7zjg4hcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAoMCDku6XkuIvjga7loLTlkIjjga/jg5Djg4Pjg5XjgqHjgrXjgqTjgrrjgojjgoopXG4iCisiLVQsIC0tc3RvcC1kZWxheT0jICAgICAgWFJVTiDjgYvjgonmjIflrprjga7OvOenkuW+jOOBqyBQQ00g44Gu6Ieq5YuV5YGc5q2iXG4iCisiLXYsIC0tdmVyYm9zZSAgICAgICAgICAgUENNIOOBruioreWumuOCkuihqOekuiAo6KSH5pWw5oyH5a6a5Y+v6IO9KVxuIgorIi1WLCAtLXZ1bWV0ZXI9VFlQRSAgICAgIGVuYWJsZSBWVSBtZXRlciAoVFlQRTogbW9ubyBvciBzdGVyZW8pXG4iCisiLUksIC0tc2VwYXJhdGUtY2hhbm5lbHMg5ZCE44OB44Oj44ON44Or44Gr5LiA44Gk44Gu44OV44Kh44Kk44Or44KS55So44GE44KLXG4iCisiICAgIC0tZGlzYWJsZS1yZXNhbXBsZSAg6Ieq5YuV44Os44O844OI5aSJ5o+b44KS56aB5q2i44GZ44KLXG4iCisiICAgIC0tZGlzYWJsZS1jaGFubmVscyAg6Ieq5YuV44OB44Oj44ON44Or5aSJ5o+b44KS56aB5q2i44GZ44KLXG4iCisiICAgIC0tZGlzYWJsZS1mb3JtYXQgICAg6Ieq5YuV44OV44Kp44O844Oe44OD44OI5aSJ5o+b44KS56aB5q2i44GZ44KLXG4iCisiICAgIC0tZGlzYWJsZS1zb2Z0dm9sICAg44K944OV44OI6Z+z6YeP5Yi25b6hKHNvZnR2b2wp44KS56aB5q2i44GZ44KLXG4iCisiICAgIC0tdGVzdC1wb3NpdGlvbiAgICAg44Oq44Oz44Kw44OQ44OD44OV44Kh5L2N572u44KS44OG44K544OI44GZ44KLXG4iCisiICAgIC0tdGVzdC1jb2VmPSMgICAgICAg44Oq44Oz44Kw44OQ44OD44OV44Kh5L2N572u44OG44K544OI44Gu5L+C5pWwICjjg4fjg5Xjgqnjg6vjg4ggOClcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICDjg4bjgrnjg4jnr4Tlm7I6IGNvZWYgKiAoYnVmZmVyX3NpemUgLyAyKVxuIgorIiAgICAtLXRlc3Qtbm93YWl0ICAgICAgIOODquODs+OCsOODkOODg+ODleOCoeOBruOCpuOCqOOCpOODiOOCkuemgeatoiAtIOazqOaEjzrpq5hDUFXosqDojbdcbiIKKworIzogYXBsYXkvYXBsYXkuYzoxOTkgc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjc0MAorIywgYy1mb3JtYXQKK21zZ2lkICJSZWNvZ25pemVkIHNhbXBsZSBmb3JtYXRzIGFyZToiCittc2dzdHIgIuiqjeitmOOBleOCjOOCi+OCteODs+ODl+ODq+ODleOCqeODvOODnuODg+ODiDoiCisKKyM6IGFwbGF5L2FwbGF5LmM6MjA1CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyJTb21lIG9mIHRoZXNlIG1heSBub3QgYmUgYXZhaWxhYmxlIG9uIHNlbGVjdGVkIGhhcmR3YXJlXG4iCittc2dzdHIgIiIKKyJcbiIKKyLjgZPjgozjgonjga7jgYTjgY/jgaTjgYvjga/mjIflrprjga7jg4/jg7zjg4njgqbjgqfjgqLjgafkvb/nlKjkuI3lj6/og73jgarloLTlkIjjgYzjgYLjgorjgb7jgZlcbiIKKworIzogYXBsYXkvYXBsYXkuYzoyMDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGF2YWlsYWJsZWQgZm9ybWF0IHNob3J0Y3V0cyBhcmU6XG4iCittc2dzdHIgIuWPr+iDveOBquODleOCqeODvOODnuODg+ODiOOBruecgeeVpeW9ojpcbiIKKworIzogYXBsYXkvYXBsYXkuYzoyMDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiLWYgY2QgKDE2IGJpdCBsaXR0bGUgZW5kaWFuLCA0NDEwMCwgc3RlcmVvKVxuIgorbXNnc3RyICItZiBjZCAoMTYg44OT44OD44OI44CB44Oq44OI44Or44Ko44Oz44OH44Kj44Ki44Oz44CBNDQxMDDjgIHjgrnjg4bjg6zjgqopXG4iCisKKyM6IGFwbGF5L2FwbGF5LmM6MjA4CisjLCBjLWZvcm1hdAorbXNnaWQgIi1mIGNkciAoMTYgYml0IGJpZyBlbmRpYW4sIDQ0MTAwLCBzdGVyZW8pXG4iCittc2dzdHIgIi1mIGNkciAoMTYg44OT44OD44OI44CB44OT44OD44Kw44Ko44Oz44OH44Kj44Ki44Oz44CBNDQxMDDjgIHjgrnjg4bjg6zjgqopXG4iCisKKyM6IGFwbGF5L2FwbGF5LmM6MjA5CisjLCBjLWZvcm1hdAorbXNnaWQgIi1mIGRhdCAoMTYgYml0IGxpdHRsZSBlbmRpYW4sIDQ4MDAwLCBzdGVyZW8pXG4iCittc2dzdHIgIi1mIGRhdCAoMTYg44OT44OD44OI44CB44Oq44OI44Or44Ko44Oz44OH44Kj44Ki44Oz44CBNDgwMDDjgIHjgrnjg4bjg6zjgqopXG4iCisKKyM6IGFwbGF5L2FwbGF5LmM6MjIzCittc2dpZCAibm8gc291bmRjYXJkcyBmb3VuZC4uLiIKK21zZ3N0ciAi44K144Km44Oz44OJ44Kr44O844OJ44GM6KaL44Gk44GL44KK44G+44Gb44KTLi4uIgorCisjOiBhcGxheS9hcGxheS5jOjIyNgorIywgYy1mb3JtYXQKK21zZ2lkICIqKioqIExpc3Qgb2YgJXMgSGFyZHdhcmUgRGV2aWNlcyAqKioqXG4iCittc2dzdHIgIioqKiog44OP44O844OJ44Km44Kn44Ki44OH44OQ44Kk44K5ICVzIOOBruODquOCueODiCAqKioqXG4iCisKKyM6IGFwbGF5L2FwbGF5LmM6MjU1CisjLCBjLWZvcm1hdAorbXNnaWQgImNhcmQgJWk6ICVzIFslc10sIGRldmljZSAlaTogJXMgWyVzXVxuIgorbXNnc3RyICLjgqvjg7zjg4kgJWk6ICVzIFslc10sIOODh+ODkOOCpOOCuSAlaTogJXMgWyVzXVxuIgorCisjOiBhcGxheS9hcGxheS5jOjI2MQorIywgYy1mb3JtYXQKK21zZ2lkICIgIFN1YmRldmljZXM6ICVpLyVpXG4iCittc2dzdHIgIiAg44K144OW44OH44OQ44Kk44K5OiAlaS8laVxuIgorCisjOiBhcGxheS9hcGxheS5jOjI2OAorIywgYy1mb3JtYXQKK21zZ2lkICIgIFN1YmRldmljZSAjJWk6ICVzXG4iCittc2dzdHIgIiAg44K144OW44OH44OQ44Kk44K5ICMlaTogJXNcbiIKKworIzogYXBsYXkvYXBsYXkuYzozMzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiQWJvcnRlZCBieSBzaWduYWwgJXMuLi5cbiIKK21zZ3N0ciAi44K344Kw44OK44OrICVzIOOBp+S4reaWrS4uLlxuIgorCisjOiBhcGxheS9hcGxheS5jOjQzMAorbXNnaWQgImNvbW1hbmQgc2hvdWxkIGJlIG5hbWVkIGVpdGhlciBhcmVjb3JkIG9yIGFwbGF5IgorbXNnc3RyICJhcmVjb3JkIOOBvuOBn+OBryBhcGxheSDjgrPjg57jg7Pjg4njga7jgb/lj6/og70iCisKKyM6IGFwbGF5L2FwbGF5LmM6NDY5CisjLCBjLWZvcm1hdAorbXNnaWQgInVucmVjb2duaXplZCBmaWxlIGZvcm1hdCAlcyIKK21zZ3N0ciAi5LiN5q2j44Gq44OV44Kh44Kk44Or44OV44Kp44O844Oe44OD44OIICVzIgorCisjOiBhcGxheS9hcGxheS5jOjQ3NgorIywgYy1mb3JtYXQKK21zZ2lkICJ2YWx1ZSAlaSBmb3IgY2hhbm5lbHMgaXMgaW52YWxpZCIKK21zZ3N0ciAi5LiN5q2j44Gq44OB44Oj44ON44Or5pWwICVpIgorCisjOiBhcGxheS9hcGxheS5jOjQ5NQorIywgYy1mb3JtYXQKK21zZ2lkICJ3cm9uZyBleHRlbmRlZCBmb3JtYXQgJyVzJyIKK21zZ3N0ciAi5LiN5q2j44Gq5ouh5by144OV44Kp44O844Oe44OD44OIICclcyciCisKKyM6IGFwbGF5L2FwbGF5LmM6NTA2CisjLCBjLWZvcm1hdAorbXNnaWQgImJhZCBzcGVlZCB2YWx1ZSAlaSIKK21zZ3N0ciAi5LiN5q2j44Gq44Os44O844OI5YCkICVpIgorCisjOiBhcGxheS9hcGxheS5jOjU5MgorIywgYy1mb3JtYXQKK21zZ2lkICJUcnkgYCVzIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4iCittc2dzdHIgIuOCiOOCiuips+OBl+OBhOaDheWgseOBr+OAjCVzIC0taGVscOOAjeOCkuWun+ihjOOBl+OBpuOBj+OBoOOBleOBhFxuIgorCisjOiBhcGxheS9hcGxheS5jOjYwOAorIywgYy1mb3JtYXQKK21zZ2lkICJhdWRpbyBvcGVuIGVycm9yOiAlcyIKK21zZ3N0ciAiIgorCisjOiBhcGxheS9hcGxheS5jOjYxMworIywgYy1mb3JtYXQKK21zZ2lkICJpbmZvIGVycm9yOiAlcyIKK21zZ3N0ciAiIgorCisjOiBhcGxheS9hcGxheS5jOjYyMAorIywgYy1mb3JtYXQKK21zZ2lkICJub25ibG9jayBzZXR0aW5nIGVycm9yOiAlcyIKK21zZ3N0ciAiIgorCisjOiBhcGxheS9hcGxheS5jOjYzMCBhcGxheS9hcGxheS5jOjczNyBhcGxheS9hcGxheS5jOjEwOTIKK21zZ2lkICJub3QgZW5vdWdoIG1lbW9yeSIKK21zZ3N0ciAi44Oh44Oi44Oq44GM6Laz44KK44G+44Gb44KTIgorCisjOiBhcGxheS9hcGxheS5jOjcyNworIywgYy1mb3JtYXQKK21zZ2lkICJyZWFkIGVycm9yIChjYWxsZWQgZnJvbSBsaW5lICVpKSIKK21zZ3N0ciAi44Oq44O844OJ44Ko44Op44O8ICglaSDooYwpIgorCisjOiBhcGxheS9hcGxheS5jOjc4NQorIywgYy1mb3JtYXQKK21zZ2lkICJ1bmtub3duIGxlbmd0aCBvZiAnZm10ICcgY2h1bmsgKHJlYWQgJXUsIHNob3VsZCBiZSAldSBhdCBsZWFzdCkiCittc2dzdHIgIiIKKworIzogYXBsYXkvYXBsYXkuYzo3OTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorInVua25vd24gbGVuZ3RoIG9mIGV4dGVuc2libGUgJ2ZtdCAnIGNodW5rIChyZWFkICV1LCBzaG91bGQgYmUgJXUgYXQgbGVhc3QpIgorbXNnc3RyICIiCisKKyM6IGFwbGF5L2FwbGF5LmM6ODAwCittc2dpZCAid3JvbmcgZm9ybWF0IHRhZyBpbiBleHRlbnNpYmxlICdmbXQgJyBjaHVuayIKK21zZ3N0ciAiIgorCisjOiBhcGxheS9hcGxheS5jOjgwNworIywgYy1mb3JtYXQKK21zZ2lkICJjYW4ndCBwbGF5IFdBVkUtZmlsZSBmb3JtYXQgMHglMDR4IHdoaWNoIGlzIG5vdCBQQ00gb3IgRkxPQVQgZW5jb2RlZCIKK21zZ3N0ciAiIgorCisjOiBhcGxheS9hcGxheS5jOjgxMQorIywgYy1mb3JtYXQKK21zZ2lkICJjYW4ndCBwbGF5IFdBVkUtZmlsZXMgd2l0aCAlZCB0cmFja3MiCittc2dzdHIgIiVkIOODiOODqeODg+OCr+OCkuWQq+OCgCBXQVZFIOODleOCoeOCpOODq+OBr+WGjeeUn+OBp+OBjeOBvuOBm+OCkyIKKworIzogYXBsYXkvYXBsYXkuYzo4MTkgYXBsYXkvYXBsYXkuYzo5MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiV2FybmluZzogZm9ybWF0IGlzIGNoYW5nZWQgdG8gVThcbiIKK21zZ3N0ciAi6K2m5ZGKOiDjg5Xjgqnjg7zjg57jg4Pjg4jjga8gVTgg44Gr5aSJ5pu044GV44KM44G+44GZXG4iCisKKyM6IGFwbGF5L2FwbGF5LmM6ODI1CisjLCBjLWZvcm1hdAorbXNnaWQgIldhcm5pbmc6IGZvcm1hdCBpcyBjaGFuZ2VkIHRvIFMxNl9MRVxuIgorbXNnc3RyICLorablkYo6IOODleOCqeODvOODnuODg+ODiOOBryBTMTZfTEUg44Gr5aSJ5pu044GV44KM44G+44GZXG4iCisKKyM6IGFwbGF5L2FwbGF5LmM6ODMzCisjLCBjLWZvcm1hdAorbXNnaWQgIldhcm5pbmc6IGZvcm1hdCBpcyBjaGFuZ2VkIHRvIFMyNF8zTEVcbiIKK21zZ3N0ciAi6K2m5ZGKOiDjg5Xjgqnjg7zjg57jg4Pjg4jjga8gUzI0XzNMRSDjgavlpInmm7TjgZXjgozjgb7jgZlcbiIKKworIzogYXBsYXkvYXBsYXkuYzo4MzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiV2FybmluZzogZm9ybWF0IGlzIGNoYW5nZWQgdG8gUzI0X0xFXG4iCittc2dzdHIgIuitpuWRijog44OV44Kp44O844Oe44OD44OI44GvIFMyNF9MRSDjgavlpInmm7TjgZXjgozjgb7jgZlcbiIKKworIzogYXBsYXkvYXBsYXkuYzo4NDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiBjYW4ndCBwbGF5IFdBVkUtZmlsZXMgd2l0aCBzYW1wbGUgJWQgYml0cyBpbiAlZCBieXRlcyB3aWRlICglZCBjaGFubmVscykiCittc2dzdHIgIiIKKyIlMiRkIOODkOOCpOODiOmVtyAlMSRkIOOCteODs+ODl+ODq+ODk+ODg+ODiCAoJTMkZCDjg4Hjg6Pjg43jg6spIOOBriBXQVZFIOODleOCoeOCpOODq+OBr+WGjeeUn+OBp+OBjSIKKyLjgb7jgZvjgpMiCisKKyM6IGFwbGF5L2FwbGF5LmM6ODU1CisjLCBjLWZvcm1hdAorbXNnaWQgIiBjYW4ndCBwbGF5IFdBVkUtZmlsZXMgd2l0aCBzYW1wbGUgJWQgYml0cyB3aWRlIgorbXNnc3RyICIlZCDjg5Pjg4Pjg4jplbfjga7jgrXjg7Pjg5fjg6vjga4gV0FWRSDjg5XjgqHjgqTjg6vjga/lho3nlJ/jgafjgY3jgb7jgZvjgpMiCisKKyM6IGFwbGF5L2FwbGF5LmM6OTEzCisjLCBjLWZvcm1hdAorbXNnaWQgIldhcm5pbmc6IGZvcm1hdCBpcyBjaGFuZ2VkIHRvIE1VX0xBV1xuIgorbXNnc3RyICLorablkYo6IOODleOCqeODvOODnuODg+ODiOOBryBNVV9MQVcg44Gr5aSJ5pu044GV44KM44G+44GZXG4iCisKKyM6IGFwbGF5L2FwbGF5LmM6OTI1CisjLCBjLWZvcm1hdAorbXNnaWQgIldhcm5pbmc6IGZvcm1hdCBpcyBjaGFuZ2VkIHRvIFMxNl9CRVxuIgorbXNnc3RyICLorablkYo6IOODleOCqeODvOODnuODg+ODiOOBryBTMTZfQkUg44Gr5aSJ5pu044GV44KM44G+44GZXG4iCisKKyM6IGFwbGF5L2FwbGF5LmM6OTM4IGFwbGF5L2FwbGF5LmM6MTc2OCBhcGxheS9hcGxheS5jOjE3NzUgYXBsYXkvYXBsYXkuYzoyMjk3CisjOiBhcGxheS9hcGxheS5jOjIzMDkKK21zZ2lkICJyZWFkIGVycm9yIgorbXNnc3RyICLjg6rjg7zjg4njgqjjg6njg7wiCisKKyM6IGFwbGF5L2FwbGF5LmM6OTU3Cittc2dpZCAiQnJva2VuIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgUENNOiBubyBjb25maWd1cmF0aW9ucyBhdmFpbGFibGUiCittc2dzdHIgIuaMh+WumuOBriBQQ00g44KS5L2/55So44Gn44GN44G+44Gb44KTOiDoqK3lrprjgYzjgYLjgorjgb7jgZvjgpMiCisKKyM6IGFwbGF5L2FwbGF5LmM6OTc0Cittc2dpZCAiQWNjZXNzIHR5cGUgbm90IGF2YWlsYWJsZSIKK21zZ3N0ciAi44Ki44Kv44K744K544K/44Kk44OX44GM5L2/55So5LiN5Y+v6IO9IgorCisjOiBhcGxheS9hcGxheS5jOjk3OQorbXNnaWQgIlNhbXBsZSBmb3JtYXQgbm9uIGF2YWlsYWJsZSIKK21zZ3N0ciAi44K144Oz44OX44Or44OV44Kp44O844Oe44OD44OI44GM5L2/55So5LiN5Y+v6IO9IgorCisjOiBhcGxheS9hcGxheS5jOjk4NAorbXNnaWQgIkNoYW5uZWxzIGNvdW50IG5vbiBhdmFpbGFibGUiCittc2dzdHIgIuODgeODo+ODjeODq+aVsOOBjOS9v+eUqOS4jeWPr+iDvSIKKworIzogYXBsYXkvYXBsYXkuYzo5OTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiV2FybmluZzogcmF0ZSBpcyBub3QgYWNjdXJhdGUgKHJlcXVlc3RlZCA9ICVpSHosIGdvdCA9ICVpSHopXG4iCittc2dzdHIgIuitpuWRijog44Os44O844OI44GM5LiN5q2j56K644Gn44GZICjopoHmsYLlgKQgPSAlaUh6LCDkvb/nlKjlgKQgPSAlaUh6KVxuIgorCisjOiBhcGxheS9hcGxheS5jOjEwMDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgICAgICAgcGxlYXNlLCB0cnkgdGhlIHBsdWcgcGx1Z2luICVzXG4iCittc2dzdHIgIiAgICAgICAgcGx1ZyDjg5fjg6njgrDjgqTjg7MlcyDjgpLkvb/nlKjjgZfjgabjgY/jgaDjgZXjgYRcbiIKKworIzogYXBsYXkvYXBsYXkuYzoxMDQxCittc2dpZCAiVW5hYmxlIHRvIGluc3RhbGwgaHcgcGFyYW1zOiIKK21zZ3N0ciAiaHcgcGFyYW1zIOOBruOCpOODs+OCueODiOODvOODq+OBq+WkseaVl+OBl+OBvuOBl+OBnzoiCisKKyM6IGFwbGF5L2FwbGF5LmM6MTA0OAorIywgYy1mb3JtYXQKK21zZ2lkICJDYW4ndCB1c2UgcGVyaW9kIGVxdWFsIHRvIGJ1ZmZlciBzaXplICglbHUgPT0gJWx1KSIKK21zZ3N0ciAicGVyaW9kIOOBqCBidWZmZXIg44K144Kk44K644Gr44Gv5ZCM44GY5YCk44KS5L2/55So44Gn44GN44G+44Gb44KTICglbHUgPT0gJWx1KSIKKworIzogYXBsYXkvYXBsYXkuYzoxMDc5Cittc2dpZCAidW5hYmxlIHRvIGluc3RhbGwgc3cgcGFyYW1zOiIKK21zZ3N0ciAic3cgcGFyYW1zIOOBruOCpOODs+OCueODiOODvOODq+OBq+WkseaVl+OBl+OBvuOBl+OBnzoiCisKKyM6IGFwbGF5L2FwbGF5LmM6MTE1NAorIywgYy1mb3JtYXQKK21zZ2lkICJzdGF0dXMgZXJyb3I6ICVzIgorbXNnc3RyICLjgrnjg4bjg7zjgr/jgrnjgqjjg6njg7w6ICVzIgorCisjOiBhcGxheS9hcGxheS5jOjExNjQgYXBsYXkvYXBsYXkuYzoxMTc1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzISEhIChhdCBsZWFzdCAlLjNmIG1zIGxvbmcpXG4iCittc2dzdHIgIiVzISEhICjlsJHjgarjgY/jgajjgoIgJS4zZiBtcylcbiIKKworIzogYXBsYXkvYXBsYXkuYzoxMTY1IGFwbGF5L2FwbGF5LmM6MTE2OCBhcGxheS9hcGxheS5jOjExNzYKK21zZ2lkICJ1bmRlcnJ1biIKK21zZ3N0ciAi44Ki44Oz44OA44O844Op44OzIgorCisjOiBhcGxheS9hcGxheS5jOjExNjUgYXBsYXkvYXBsYXkuYzoxMTc2Cittc2dpZCAib3ZlcnJ1biIKK21zZ3N0ciAi44Kq44O844OQ44O844Op44OzIgorCisjOiBhcGxheS9hcGxheS5jOjExODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3RhdHVzOlxuIgorbXNnc3RyICLjgrnjg4bjg7zjgr/jgrk6XG4iCisKKyM6IGFwbGF5L2FwbGF5LmM6MTE4NAorIywgYy1mb3JtYXQKK21zZ2lkICJ4cnVuOiBwcmVwYXJlIGVycm9yOiAlcyIKK21zZ3N0ciAiIgorCisjOiBhcGxheS9hcGxheS5jOjExOTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3RhdHVzKERSQUlOSU5HKTpcbiIKK21zZ3N0ciAi44K544OG44O844K/44K5KERSQUlOSU5HKTpcbiIKKworIzogYXBsYXkvYXBsYXkuYzoxMTk0CisjLCBjLWZvcm1hdAorbXNnaWQgImNhcHR1cmUgc3RyZWFtIGZvcm1hdCBjaGFuZ2U/IGF0dGVtcHRpbmcgcmVjb3Zlci4uLlxuIgorbXNnc3RyICLpjLLpn7Pjgrnjg4jjg6rjg7zjg6Djga7jg5Xjgqnjg7zjg57jg4Pjg4jjgYzlpInmm7TvvJ8g5L+u5b6p44KS6Kmm44G/44G+44GZLi4uXG4iCisKKyM6IGFwbGF5L2FwbGF5LmM6MTE5NgorIywgYy1mb3JtYXQKK21zZ2lkICJ4cnVuKERSQUlOSU5HKTogcHJlcGFyZSBlcnJvcjogJXMiCittc2dzdHIgIiIKKworIzogYXBsYXkvYXBsYXkuYzoxMjAzCisjLCBjLWZvcm1hdAorbXNnaWQgIlN0YXR1cyhSL1cpOlxuIgorbXNnc3RyICLjgrnjg4bjg7zjgr/jgrkoUi9XKTpcbiIKKworIzogYXBsYXkvYXBsYXkuYzoxMjA2CisjLCBjLWZvcm1hdAorbXNnaWQgInJlYWQvd3JpdGUgZXJyb3IsIHN0YXRlID0gJXMiCittc2dzdHIgIuiqreOBv+abuOOBjeOCqOODqeODvCwg44K544OG44O844K/44K5ID0gJXMiCisKKyM6IGFwbGF5L2FwbGF5LmM6MTIxNgorIywgYy1mb3JtYXQKK21zZ2lkICJTdXNwZW5kZWQuIFRyeWluZyByZXN1bWUuICIKK21zZ3N0ciAi44K144K544Oa44Oz44OJ5Lit44Gn44GZ44CC44Os44K444Ol44O844Og44GX44G+44GZ44CCIgorCisjOiBhcGxheS9hcGxheS5jOjEyMjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkLiBSZXN0YXJ0aW5nIHN0cmVhbS4gIgorbXNnc3RyICLlpLHmlZfjgZfjgb7jgZfjgZ/jgILjgrnjg4jjg6rjg7zjg6DjgpLlho3jgrnjgr/jg7zjg4jjgZfjgb7jgZnjgIIiCisKKyM6IGFwbGF5L2FwbGF5LmM6MTIyMworIywgYy1mb3JtYXQKK21zZ2lkICJzdXNwZW5kOiBwcmVwYXJlIGVycm9yOiAlcyIKK21zZ3N0ciAi44K144K544Oa44Oz44OJOiBwcmVwYXJlIOOCqOODqeODvDogJXMiCisKKyM6IGFwbGF5L2FwbGF5LmM6MTIyOAorIywgYy1mb3JtYXQKK21zZ2lkICJEb25lLlxuIgorbXNnc3RyICLntYLkuoZcbiIKKworIzogYXBsYXkvYXBsYXkuYzoxMjUwCisjLCBjLWZvcm1hdAorbXNnaWQgIiAhY2xpcCAgIgorbXNnc3RyICIiCisKKyM6IGFwbGF5L2FwbGF5LmM6MTM5NworIywgYy1mb3JtYXQKK21zZ2lkICJVbnN1cHBvcnRlZCBiaXQgc2l6ZSAlZC5cbiIKK21zZ3N0ciAiIgorCisjOiBhcGxheS9hcGxheS5jOjE0MzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiTWF4IHBlYWsgKCVsaSBzYW1wbGVzKTogMHglMDh4ICIKK21zZ3N0ciAi5pyA5aSn44OU44O844KvICglbGkg44K144Oz44OX44OrKTogMHglMDh4ICIKKworIzogYXBsYXkvYXBsYXkuYzoxNDY1CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJTdXNwaWNpb3VzIGJ1ZmZlciBwb3NpdGlvbiAoJWxpIHRvdGFsKTogYXZhaWwgPSAlbGksIGRlbGF5ID0gJWxpLCBidWZmZXIgPSAlIgorImxpXG4iCittc2dzdHIgIiIKKworIzogYXBsYXkvYXBsYXkuYzoxNTI4CisjLCBjLWZvcm1hdAorbXNnaWQgIndyaXRlIGVycm9yOiAlcyIKK21zZ3N0ciAi5pu46L6844Ko44Op44O8OiAlcyIKKworIzogYXBsYXkvYXBsYXkuYzoxNTc0CisjLCBjLWZvcm1hdAorbXNnaWQgIndyaXRldiBlcnJvcjogJXMiCittc2dzdHIgIuabuOi+vCh3cml0ZXYp44Ko44Op44O8OiAlcyIKKworIzogYXBsYXkvYXBsYXkuYzoxNjE3CisjLCBjLWZvcm1hdAorbXNnaWQgInJlYWQgZXJyb3I6ICVzIgorbXNnc3RyICLoqq3ovrzjgqjjg6njg7w6ICVzIgorCisjOiBhcGxheS9hcGxheS5jOjE2NjAKKyMsIGMtZm9ybWF0Cittc2dpZCAicmVhZHYgZXJyb3I6ICVzIgorbXNnc3RyICLoqq3ovrwocmVhZHYp44Ko44Op44O8OiAlcyIKKworIzogYXBsYXkvYXBsYXkuYzoxNzA4Cittc2dpZCAiY2FuJ3QgYWxsb2NhdGUgYnVmZmVyIGZvciBzaWxlbmNlIgorbXNnc3RyICLjgrXjgqTjg6zjg7PjgrnnlKjjga7jg5Djg4Pjg5XjgqHjga7lj5blvpfjgavlpLHmlZfjgZfjgb7jgZfjgZ8iCisKKyM6IGFwbGF5L2FwbGF5LmM6MTcxNyBhcGxheS9hcGxheS5jOjE5NDMgYXBsYXkvYXBsYXkuYzoxOTQ4IGFwbGF5L2FwbGF5LmM6MTk5NQorIzogYXBsYXkvYXBsYXkuYzoyMDA0IGFwbGF5L2FwbGF5LmM6MjAxMSBhcGxheS9hcGxheS5jOjIwMjEgYXBsYXkvYXBsYXkuYzoyMDI3CisjOiBhcGxheS9hcGxheS5jOjIwOTkgYXBsYXkvYXBsYXkuYzoyMTI5IGFwbGF5L2FwbGF5LmM6MjE0MworbXNnaWQgIndyaXRlIGVycm9yIgorbXNnc3RyICLmm7jovrzjgqjjg6njg7wiCisKKyM6IGFwbGF5L2FwbGF5LmM6MTczMAorIywgYy1mb3JtYXQKK21zZ2lkICJ2b2NfcGNtX2ZsdXNoIC0gc2lsZW5jZSBlcnJvciIKK21zZ3N0ciAiIgorCisjOiBhcGxheS9hcGxheS5jOjE3MzMKK21zZ2lkICJ2b2NfcGNtX2ZsdXNoIGVycm9yIgorbXNnc3RyICIiCisKKyM6IGFwbGF5L2FwbGF5LmM6MTc1OQorbXNnaWQgIm1hbGxvYyBlcnJvciIKK21zZ3N0ciAibWFsbG9jIOOCqOODqeODvCIKKworIzogYXBsYXkvYXBsYXkuYzoxNzYzCisjLCBjLWZvcm1hdAorbXNnaWQgIlBsYXlpbmcgQ3JlYXRpdmUgTGFicyBDaGFubmVsIGZpbGUgJyVzJy4uLlxuIgorbXNnc3RyICJDcmVhdGl2ZSBMYWJzIENoYW5uZWwg44OV44Kh44Kk44OrICclcycg44KS5ryU5aWP5LitLi4uXG4iCisKKyM6IGFwbGF5L2FwbGF5LmM6MTgzMSBhcGxheS9hcGxheS5jOjE5MjMKK21zZ2lkICJjYW4ndCBwbGF5IHBhY2tlZCAudm9jIGZpbGVzIgorbXNnc3RyICJwYWNrZWQgLnZvYyDjg5XjgqHjgqTjg6vjga/mvJTlpY/jgafjgY3jgb7jgZvjgpMiCisKKyM6IGFwbGF5L2FwbGF5LmM6MTg4MworIywgYy1mb3JtYXQKK21zZ2lkICJjYW4ndCBwbGF5IGxvb3BzOyAlcyBpc24ndCBzZWVrYWJsZVxuIgorbXNnc3RyICLjg6vjg7zjg5fmvJTlpY/jgafjgY3jgb7jgZvjgpPjgIIlcyDjga/jgrfjg7zjgq/kuI3lj6/og73jgafjgZlcbiIKKworIzogYXBsYXkvYXBsYXkuYzoxOTMyCisjLCBjLWZvcm1hdAorbXNnaWQgInVua25vd24gYmxvY2t0eXBlICVkLiB0ZXJtaW5hdGUuIgorbXNnc3RyICLmnKrnn6Xjga7jg5bjg63jg4Pjgq/jgr/jgqTjg5cgJWQ6IOe1guS6huOBl+OBvuOBmeOAgiIKKworIzogYXBsYXkvYXBsYXkuYzoyMDYzCisjLCBjLWZvcm1hdAorbXNnaWQgIldhdmUgZG9lc24ndCBzdXBwb3J0ICVzIGZvcm1hdC4uLiIKK21zZ3N0ciAiV0FWRSDjga8gJXMg44OV44Kp44O844Oe44OD44OI44KS44K144Od44O844OI44GX44G+44Gb44KTLi4uIgorCisjOiBhcGxheS9hcGxheS5jOjIxMjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3BhcmMgQXVkaW8gZG9lc24ndCBzdXBwb3J0ICVzIGZvcm1hdC4uLiIKK21zZ3N0ciAiU3BhcmMg44Kq44O844OH44Kj44Kq44GvICVzIOODleOCqeODvOODnuODg+ODiOOCkuOCteODneODvOODiOOBl+OBvuOBm+OCky4uLiIKKworIzogYXBsYXkvYXBsYXkuYzoyMjA0Cittc2dpZCAiUGxheWluZyIKK21zZ3N0ciAi5YaN55Sf5LitIgorCisjOiBhcGxheS9hcGxheS5jOjIyMDQKK21zZ2lkICJSZWNvcmRpbmciCittc2dzdHIgIumMsumfs+S4rSIKKworIzogYXBsYXkvYXBsYXkuYzoyMjA4CisjLCBjLWZvcm1hdAorbXNnaWQgIlJhdGUgJWQgSHosICIKK21zZ3N0ciAi44Os44O844OIICVkIEh6LCAiCisKKyM6IGFwbGF5L2FwbGF5LmM6MjIxMAorIywgYy1mb3JtYXQKK21zZ2lkICJNb25vIgorbXNnc3RyICLjg6Ljg47jg6njg6siCisKKyM6IGFwbGF5L2FwbGF5LmM6MjIxMgorIywgYy1mb3JtYXQKK21zZ2lkICJTdGVyZW8iCittc2dzdHIgIuOCueODhuODrOOCqiIKKworIzogYXBsYXkvYXBsYXkuYzoyMjE0CisjLCBjLWZvcm1hdAorbXNnaWQgIkNoYW5uZWxzICVpIgorbXNnc3RyICLjg4Hjg6Pjg43jg6vmlbAgJWkiCisKKyM6IGFwbGF5L2FwbGF5LmM6MjU3MyBhcGxheS9hcGxheS5jOjI2MjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiWW91IG5lZWQgdG8gc3BlY2lmeSAlZCBmaWxlcyIKK21zZ3N0ciAiJWQg5YCL44Gu44OV44Kh44Kk44Or44KS5oyH5a6a44GX44Gm44GP44Gg44GV44GEIgorCisjOiBzZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzo0OQorIywgYy1mb3JtYXQKK21zZ2lkICJhY29ubmVjdCAtIEFMU0Egc2VxdWVuY2VyIGNvbm5lY3Rpb24gbWFuYWdlclxuIgorbXNnc3RyICJhY29ubmVjdCAtIEFMU0Egc2VxdWVuY2VyIOaOpee2muODnuODjeODvOOCuOODo1xuIgorCisjOiBzZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzo1MAorIywgYy1mb3JtYXQKK21zZ2lkICJDb3B5cmlnaHQgKEMpIDE5OTktMjAwMCBUYWthc2hpIEl3YWlcbiIKK21zZ3N0ciAiIgorCisjOiBzZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzo1MQorIywgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTpcbiIKK21zZ3N0ciAi5L2/55So5rOVOlxuIgorCisjOiBzZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzo1MgorIywgYy1mb3JtYXQKK21zZ2lkICIgKiBDb25uZWN0aW9uL2Rpc2Nvbm5lY3Rpb24gYmV0d2VlbiB0d28gcG9ydHNcbiIKK21zZ3N0ciAiICog5LqM44Gk44Gu44Od44O844OI44Gu5o6l57aa77yP5YiH44KK6Zui44GXXG4iCisKKyM6IHNlcS9hY29ubmVjdC9hY29ubmVjdC5jOjUzCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgIGFjb25uZWN0IFstb3B0aW9uc10gc2VuZGVyIHJlY2VpdmVyXG4iCittc2dzdHIgIiAgIGFjb25uZWN0IFst44Kq44OX44K344On44OzXSDpgIHkv6Eg5Y+X5L+hXG4iCisKKyM6IHNlcS9hY29ubmVjdC9hY29ubmVjdC5jOjU0CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICAgc2VuZGVyLCByZWNlaXZlciA9IGNsaWVudDpwb3J0IHBhaXJcbiIKK21zZ3N0ciAiICAgICDpgIHkv6EsIOWPl+S/oSA9IOOCr+ODqeOCpOOCouODs+ODiDrjg53jg7zjg4jjga7ntYRcbiIKKworIzogc2VxL2Fjb25uZWN0L2Fjb25uZWN0LmM6NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgICAtZCwtLWRpc2Nvbm5lY3QgICAgIGRpc2Nvbm5lY3RcbiIKK21zZ3N0ciAiICAgICAtZCwtLWRpc2Nvbm5lY3QgICAgIOWIh+OCiumbouOBl1xuIgorCisjOiBzZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzo1NgorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgIC1lLC0tZXhjbHVzaXZlICAgICAgZXhjbHVzaXZlIGNvbm5lY3Rpb25cbiIKK21zZ3N0ciAiICAgICAtZSwtLWV4Y2x1c2l2ZSAgICAgIOaOkuS7luaOpee2mlxuIgorCisjOiBzZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzo1NworIywgYy1mb3JtYXQKK21zZ2lkICIgICAgIC1yLC0tcmVhbCAjICAgICAgICAgY29udmVydCByZWFsLXRpbWUtc3RhbXAgb24gcXVldWVcbiIKK21zZ3N0ciAiICAgICAtciwtLXJlYWwgIyAgICAgICAgIOOCreODpeODvOOBruODquOCouODq+OCv+OCpOODoOOCueOCv+ODs+ODl+OBq+WkieaPm1xuIgorCisjOiBzZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzo1OAorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgIC10LC0tdGljayAjICAgICAgICAgY29udmVydCB0aWNrLXRpbWUtc3RhbXAgb24gcXVldWVcbiIKK21zZ3N0ciAiICAgIC10LC0tdGljayAjICAgICAgICAgIOOCreODpeODvOOBruODhuOCo+ODg+OCr+OCv+OCpOODoOOCueOCv+ODs+ODl+OBq+WkieaPm1xuIgorCisjOiBzZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzo1OQorIywgYy1mb3JtYXQKK21zZ2lkICIgKiBMaXN0IGNvbm5lY3RlZCBwb3J0cyAobm8gc3Vic2NyaXB0aW9uIGFjdGlvbilcbiIKK21zZ3N0ciAiICog5o6l57aa5riI44G/44Gu44Od44O844OI44Gu5LiA6KanXG4iCisKKyM6IHNlcS9hY29ubmVjdC9hY29ubmVjdC5jOjYwCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgIGFjb25uZWN0IC1pfC1vIFstb3B0aW9uc11cbiIKK21zZ3N0ciAiICAgYWNvbm5lY3QgLWl8LW8gWy3jgqrjg5fjgrfjg6fjg7NdXG4iCisKKyM6IHNlcS9hY29ubmVjdC9hY29ubmVjdC5jOjYxCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICAgLWksLS1pbnB1dCAgICAgICAgICBsaXN0IGlucHV0IChyZWFkYWJsZSkgcG9ydHNcbiIKK21zZ3N0ciAiICAgICAtaSwtLWlucHV0ICAgICAgICAgIOWFpeWKmyAo6Kqt6L68KSDjg53jg7zjg4jjga7kuIDopqdcbiIKKworIzogc2VxL2Fjb25uZWN0L2Fjb25uZWN0LmM6NjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgICAtbywtLW91dHB1dCAgICAgICAgIGxpc3Qgb3V0cHV0ICh3cml0YWJsZSkgcG9ydHNcbiIKK21zZ3N0ciAiICAgICAtbywtLW91dHB1dCAgICAgICAgIOS4u+WKmyAo5pu46L68KSDjg53jg7zjg4jjga7kuIDopqdcbiIKKworIzogc2VxL2Fjb25uZWN0L2Fjb25uZWN0LmM6NjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgICAtbCwtLWxpc3QgICAgICAgICAgIGxpc3QgY3VycmVudCBjb25uZWN0aW9ucyBvZiBlYWNoIHBvcnRcbiIKK21zZ3N0ciAiICAgICAtbCwtLWxpc3QgICAgICAgICAgIOWQhOODneODvOODiOOBruePvuWcqOOBruaOpee2muOCkuihqOekulxuIgorCisjOiBzZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzo2NAorIywgYy1mb3JtYXQKK21zZ2lkICIgKiBSZW1vdmUgYWxsIGV4cG9ydGVkIGNvbm5lY3Rpb25zXG4iCittc2dzdHIgIiAqIOWFqOOBpuOBruOCqOOCr+OCueODneODvOODiOOBleOCjOOBn+aOpee2muOCkuWIh+OCiumbouOBmVxuIgorCisjOiBzZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzo2NQorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgIC14LCAtLXJlbW92ZWFsbFxuIgorbXNnc3RyICIgICAgIC14LCAtLXJlbW92YWxsXG4iCisKKyM6IHNlcS9hY29ubmVjdC9hY29ubmVjdC5jOjEzMgorbXNnaWQgIkNvbm5lY3RpbmcgVG8iCittc2dzdHIgIuaOpee2muWFiCIKKworIzogc2VxL2Fjb25uZWN0L2Fjb25uZWN0LmM6MTMzCittc2dpZCAiQ29ubmVjdGVkIEZyb20iCittc2dzdHIgIuaOpee2muWFgyIKKworIzogc2VxL2Fjb25uZWN0L2Fjb25uZWN0LmM6MTY5CisjLCBjLWZvcm1hdAorbXNnaWQgImNsaWVudCAlZDogJyVzJyBbdHlwZT0lc11cbiIKK21zZ3N0ciAi44Kv44Op44Kk44Ki44Oz44OIICVkOiAnJXMnIFvjgr/jgqTjg5c9JXNdXG4iCisKKyM6IHNlcS9hY29ubmVjdC9hY29ubmVjdC5jOjE3MworbXNnaWQgInVzZXIiCittc2dzdHIgIuODpuODvOOCtiIKKworIzogc2VxL2Fjb25uZWN0L2Fjb25uZWN0LmM6MTczCittc2dpZCAia2VybmVsIgorbXNnc3RyICLjgqvjg7zjg43jg6siCisKKyM6IHNlcS9hY29ubmVjdC9hY29ubmVjdC5jOjMyNgorIywgYy1mb3JtYXQKK21zZ2lkICJjYW4ndCBvcGVuIHNlcXVlbmNlclxuIgorbXNnc3RyICJzZXF1ZW5jZXIg44KS44Kq44O844OX44Oz44Gn44GN44G+44Gb44KTXG4iCisKKyM6IHNlcS9hY29ubmVjdC9hY29ubmVjdC5jOjM1NAorIywgYy1mb3JtYXQKK21zZ2lkICJjYW4ndCBnZXQgY2xpZW50IGlkXG4iCittc2dzdHIgIuOCr+ODqeOCpOOCouODs+ODiCBJRCDjgpLlj5blvpfjgafjgY3jgb7jgZvjgpNcbiIKKworIzogc2VxL2Fjb25uZWN0L2Fjb25uZWN0LmM6MzYxCisjLCBjLWZvcm1hdAorbXNnaWQgImNhbid0IHNldCBjbGllbnQgaW5mb1xuIgorbXNnc3RyICLjgq/jg6njgqTjgqLjg7Pjg4jmg4XloLHjgpLlj5blvpfjgafjgY3jgb7jgZvjgpNcbiIKKworIzogc2VxL2Fjb25uZWN0L2Fjb25uZWN0LmM6MzY4CisjLCBjLWZvcm1hdAorbXNnaWQgImludmFsaWQgc2VuZGVyIGFkZHJlc3MgJXNcbiIKK21zZ3N0ciAi6YCB5L+h44Ki44OJ44Os44K544GM5LiN5q2j44Gn44GZOiAlc1xuIgorCisjOiBzZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzozNzMgc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjI5MAorIywgYy1mb3JtYXQKK21zZ2lkICJpbnZhbGlkIGRlc3RpbmF0aW9uIGFkZHJlc3MgJXNcbiIKK21zZ3N0ciAi5Y+X5L+h44Ki44OJ44Os44K544GM5LiN5q2j44Gn44GZOiAlc1xuIgorCisjOiBzZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzozODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiTm8gc3Vic2NyaXB0aW9uIGlzIGZvdW5kXG4iCittc2dzdHIgIuaOpee2muOBjOimi+OBpOOBi+OCiuOBvuOBm+OCk1xuIgorCisjOiBzZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzozOTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGlzY29ubmVjdGlvbiBmYWlsZWQgKCVzKVxuIgorbXNnc3RyICLliIfjgorpm6LjgZfjgavlpLHmlZcgKCVzKVxuIgorCisjOiBzZXEvYWNvbm5lY3QvYWNvbm5lY3QuYzozOTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29ubmVjdGlvbiBpcyBhbHJlYWR5IHN1YnNjcmliZWRcbiIKK21zZ3N0ciAi5pei44Gr5o6l57aa44GV44KM44Gm44GE44G+44GZXG4iCisKKyM6IHNlcS9hY29ubmVjdC9hY29ubmVjdC5jOjQwMworIywgYy1mb3JtYXQKK21zZ2lkICJDb25uZWN0aW9uIGZhaWxlZCAoJXMpXG4iCittc2dzdHIgIuaOpee2muOBq+WkseaVlyAoJXMpXG4iCisKKyM6IHNlcS9hc2VxbmV0L2FzZXFuZXQuYzoxNjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiYXNlcW5ldCAtIG5ldHdvcmsgY2xpZW50L3NlcnZlciBvbiBBTFNBIHNlcXVlbmNlclxuIgorbXNnc3RyICJhc2VxbmV0IC0gQUxTQSBzZXF1ZW5jZXIg5LiK44Gu44ON44OD44OI44Ov44O844Kv44Kv44Op44Kk44Ki44Oz44OI77yP44K144O844OQXG4iCisKKyM6IHNlcS9hc2VxbmV0L2FzZXFuZXQuYzoxNjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBDb3B5cmlnaHQgKEMpIDE5OTkgVGFrYXNoaSBJd2FpXG4iCittc2dzdHIgIiIKKworIzogc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjE2NgorIywgYy1mb3JtYXQKK21zZ2lkICJ1c2FnZTpcbiIKK21zZ3N0ciAi5L2/55So5rOVOlxuIgorCisjOiBzZXEvYXNlcW5ldC9hc2VxbmV0LmM6MTY3CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgc2VydmVyIG1vZGU6IGFzZXFuZXQgWy1vcHRpb25zXVxuIgorbXNnc3RyICIgIOOCteODvOODkOODouODvOODiTogYXNlcW5ldCBbLeOCquODl+OCt+ODp+ODs11cbiIKKworIzogc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjE2OAorIywgYy1mb3JtYXQKK21zZ2lkICIgIGNsaWVudCBtb2RlOiBhc2VxbmV0IFstb3B0aW9uc10gc2VydmVyX2hvc3RcbiIKK21zZ3N0ciAiICDjgq/jg6njgqTjgqLjg7Pjg4jjg6Ljg7zjg4k6IGFzZXFuZXQgWy3jgqrjg5fjgrfjg6fjg7NdIOOCteODvOODkOODm+OCueODiFxuIgorCisjOiBzZXEvYXNlcW5ldC9hc2VxbmV0LmM6MTY5CisjLCBjLWZvcm1hdAorbXNnaWQgIm9wdGlvbnM6XG4iCittc2dzdHIgIuOCquODl+OCt+ODp+ODszpcbiIKKworIzogc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjE3MAorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1wLC0tcG9ydCAjIDogc2VwY2lmeSBUQ1AgcG9ydCAoZGlnaXQgb3Igc2VydmljZSBuYW1lKVxuIgorbXNnc3RyICIgIC1wLC0tcG9ydCAjIDogVENQIOODneODvOODiOOBruaMh+WumiAo5pWw5a2X44G+44Gf44Gv44K144O844OT44K55ZCNKVxuIgorCisjOiBzZXEvYXNlcW5ldC9hc2VxbmV0LmM6MTcxCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLXMsLS1zb3VyY2UgYWRkciA6IHJlYWQgZnJvbSBnaXZlbiBhZGRyIChjbGllbnQ6cG9ydClcbiIKK21zZ3N0ciAiICAtcywtLXNvdXJjZSBhZGRyIDog5oyH5a6a44Gu44Ki44OJ44Os44K5KOOCr+ODqeOCpOOCouODs+ODiDrjg53jg7zjg4gp44GL44KJ6Kqt44G/6L6844KAXG4iCisKKyM6IHNlcS9hc2VxbmV0L2FzZXFuZXQuYzoxNzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtZCwtLWRlc3QgYWRkciA6IHdyaXRlIHRvIGdpdmVuIGFkZHIgKGNsaWVudDpwb3J0KVxuIgorbXNnc3RyICIgIC1kLC0tZGVzdCBhZGRyIDog5oyH5a6a44Gu44Ki44OJ44Os44K5KOOCr+ODqeOCpOOCouODs+ODiDrjg53jg7zjg4gp44Gr5pu444GN6L6844KAXG4iCisKKyM6IHNlcS9hc2VxbmV0L2FzZXFuZXQuYzoxNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtdiwgLS12ZXJib3NlIDogcHJpbnQgdmVyYm9zZSBtZXNzYWdlc1xuIgorbXNnc3RyICIgIC12LC0tdmVyYm9zZSA6IOWGl+mVt+ODoeODg+OCu+ODvOOCuOihqOekulxuIgorCisjOiBzZXEvYXNlcW5ldC9hc2VxbmV0LmM6MTc0CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLWksIC0taW5mbyA6IHByaW50IGNlcnRhaW4gcmVjZWl2ZWQgZXZlbnRzXG4iCittc2dzdHIgIiAgLWksLS1pbmZvIDog5Y+X5L+h44Kk44OZ44Oz44OI44KS6KGo56S644GZ44KLXG4iCisKKyM6IHNlcS9hc2VxbmV0L2FzZXFuZXQuYzoxODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiY2FuJ3QgbWFsbG9jXG4iCittc2dzdHIgIm1hbGxvYyDjgafjgY3jgb7jgZvjgpNcbiIKKworIzogc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjIxMworIywgYy1mb3JtYXQKK21zZ2lkICJjbG9zaW5nIGZpbGVzLi5cbiIKK21zZ3N0ciAi44OV44Kh44Kk44Or44KS6ZaJ44GY44G+44GZLi5cbiIKKworIzogc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjI3MgorIywgYy1mb3JtYXQKK21zZ2lkICJzZXF1ZW5jZXIgb3BlbmVkOiAlZDolZFxuIgorbXNnc3RyICIiCisKKyM6IHNlcS9hc2VxbmV0L2FzZXFuZXQuYzoyNzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiaW52YWxpZCBzb3VyY2UgYWRkcmVzcyAlc1xuIgorbXNnc3RyICLkuI3mraPjgarpgIHkv6HjgqLjg4njg6zjgrkgJXNcbiIKKworIzogc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjMwOQorIywgYy1mb3JtYXQKK21zZ2lkICJzZXJ2aWNlICclcycgaXMgbm90IGZvdW5kIGluIC9ldGMvc2VydmljZXNcbiIKK21zZ3N0ciAi44K144O844OT44K5ICclcycg44GMIC9ldGMvc2VydmljZXMg44Gr6KaL44Gk44GL44KK44G+44Gb44KTXG4iCisKKyM6IHNlcS9hc2VxbmV0L2FzZXFuZXQuYzozNzcKKyMsIGMtZm9ybWF0Cittc2dpZCAidG9vIG1hbnkgY29ubmVjdGlvbnMhXG4iCittc2dzdHIgIuaOpee2muOBjOWkmuOBmeOBjuOBvuOBmSFcbiIKKworIzogc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjM4OAorIywgYy1mb3JtYXQKK21zZ2lkICJhY2NlcHRlZFslZF1cbiIKK21zZ3N0ciAi5LqG6KejWyVkXVxuIgorCisjOiBzZXEvYXNlcW5ldC9hc2VxbmV0LmM6NDExCisjLCBjLWZvcm1hdAorbXNnaWQgImNhbid0IGdldCBhZGRyZXNzICVzXG4iCittc2dzdHIgIuOCouODieODrOOCuSAlcyDjgpLlj5blvpfjgafjgY3jgb7jgZvjgpNcbiIKKworIzogc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjQyMgorIywgYy1mb3JtYXQKK21zZ2lkICJvay4uIGNvbm5lY3RlZFxuIgorbXNnc3RyICJvay4uIOaOpee2mlxuIgorCisjOiBzZXEvYXNlcW5ldC9hc2VxbmV0LmM6NTE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkNoYW5uZWwgJTJkOiBDb250cm9sIGV2ZW50IDogJTVkXG4iCittc2dzdHIgIuODgeODo+ODjeODqyAlMmQ6IOOCs+ODs+ODiOODreODvOODqyA6ICU1ZFxuIgorCisjOiBzZXEvYXNlcW5ldC9hc2VxbmV0LmM6NTIyCisjLCBjLWZvcm1hdAorbXNnaWQgIkNoYW5uZWwgJTJkOiBQaXRjaGJlbmRlciAgIDogJTVkXG4iCittc2dzdHIgIuODgeODo+ODjeODqyAlMmQ6IOODlOODg+ODgeODmeODs+ODiSA6ICU1ZFxuIgorCisjOiBzZXEvYXNlcW5ldC9hc2VxbmV0LmM6NTI2CisjLCBjLWZvcm1hdAorbXNnaWQgIkNoYW5uZWwgJTJkOiBOb3RlIE9uIGV2ZW50IDogJTVkXG4iCittc2dzdHIgIuODgeODo+ODjeODqyAlMmQ6IOODjuODvOODiOOCquODsyAgIDogJTVkXG4iCisKKyM6IHNlcS9hc2VxbmV0L2FzZXFuZXQuYzo1MzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2hhbm5lbCAlMmQ6IE5vdGUgT2ZmIGV2ZW50OiAlNWRcbiIKK21zZ3N0ciAi44OB44Oj44ON44OrICUyZDog44OO44O844OI44Kq44OVICAgOiAlNWRcbiIKKworIzogc2VxL2FzZXFuZXQvYXNlcW5ldC5jOjU4NQorIywgYy1mb3JtYXQKK21zZ2lkICJkaXNjb25uZWN0ZWRcbiIKK21zZ3N0ciAi5YiH44KK6Zui44GXXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzoxMDIKK21zZ2lkICJGcm9udCBMZWZ0IgorbXNnc3RyICIiCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzoxMDMKK21zZ2lkICJGcm9udCBSaWdodCIKK21zZ3N0ciAiIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6MTA0Cittc2dpZCAiUmVhciBMZWZ0IgorbXNnc3RyICIiCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzoxMDUKK21zZ2lkICJSZWFyIFJpZ2h0IgorbXNnc3RyICIiCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzoxMDcKK21zZ2lkICJMRkUiCittc2dzdHIgIiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjEwOAorbXNnaWQgIlNpZGUgTGVmdCIKK21zZ3N0ciAiIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6MTA5Cittc2dpZCAiU2lkZSBSaWdodCIKK21zZ3N0ciAiIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6MTEwCittc2dpZCAiQ2hhbm5lbCA5IgorbXNnc3RyICIiCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzoxMTEKK21zZ2lkICJDaGFubmVsIDEwIgorbXNnc3RyICIiCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzoxMTIKK21zZ2lkICJDaGFubmVsIDExIgorbXNnc3RyICIiCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzoxMTMKK21zZ2lkICJDaGFubmVsIDEyIgorbXNnc3RyICIiCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzoxMTQKK21zZ2lkICJDaGFubmVsIDEzIgorbXNnc3RyICIiCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzoxMTUKK21zZ2lkICJDaGFubmVsIDE0IgorbXNnc3RyICIiCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzoxMTYKK21zZ2lkICJDaGFubmVsIDE1IgorbXNnc3RyICIiCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzoxMTcKK21zZ2lkICJDaGFubmVsIDE2IgorbXNnc3RyICIiCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzozMDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQnJva2VuIGNvbmZpZ3VyYXRpb24gZm9yIHBsYXliYWNrOiBubyBjb25maWd1cmF0aW9ucyBhdmFpbGFibGU6ICVzXG4iCittc2dzdHIgIuWGjeeUn+eUqOOBq+ioreWumuOBp+OBjeOBvuOBm+OCkzog6Kit5a6a44GM44G/44Gk44GL44KK44G+44Gb44KTOiAlc1xuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6MzE0CisjLCBjLWZvcm1hdAorbXNnaWQgIkFjY2VzcyB0eXBlIG5vdCBhdmFpbGFibGUgZm9yIHBsYXliYWNrOiAlc1xuIgorbXNnc3RyICLjgqLjgq/jgrvjgrnjgr/jgqTjg5fjgYzkuI3mraPjgafjgZk6ICVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzozMjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2FtcGxlIGZvcm1hdCBub3QgYXZhaWxhYmxlIGZvciBwbGF5YmFjazogJXNcbiIKK21zZ3N0ciAi5oyH5a6a44Gu44K144Oz44OX44Or44OV44Kp44O844Oe44OD44OI44KS5L2/55So44Gn44GN44G+44Gb44KTOiAlc1xuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6MzI4CisjLCBjLWZvcm1hdAorbXNnaWQgIkNoYW5uZWxzIGNvdW50ICglaSkgbm90IGF2YWlsYWJsZSBmb3IgcGxheWJhY2tzOiAlc1xuIgorbXNnc3RyICLjg4Hjg6Pjg43jg6vmlbAgKCVpKSDjgpLkvb/nlKjjgafjgY3jgb7jgZvjgpM6ICVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzozMzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmF0ZSAlaUh6IG5vdCBhdmFpbGFibGUgZm9yIHBsYXliYWNrOiAlc1xuIgorbXNnc3RyICLjg6zjg7zjg4ggJWlIeiDjgpLkvb/nlKjjgafjgY3jgb7jgZvjgpM6ICVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzozNDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmF0ZSBkb2Vzbid0IG1hdGNoIChyZXF1ZXN0ZWQgJWlIeiwgZ2V0ICVpSHosIGVyciAlZClcbiIKK21zZ3N0ciAi6Kit5a6a44Os44O844OI44GM5LiA6Ie044GX44G+44Gb44KTPCAo6KaB5rGC5YCkICVpSHosIOWPluW+l+WApCAlaUh6LCDjgqjjg6njg7wgJWQpXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzozNDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmF0ZSBzZXQgdG8gJWlIeiAocmVxdWVzdGVkICVpSHopXG4iCittc2dzdHIgIuODrOODvOODiCAlaUh6ICjopoHmsYLlgKQgJWlIeilcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjM1MQorIywgYy1mb3JtYXQKK21zZ2lkICJCdWZmZXIgc2l6ZSByYW5nZSBmcm9tICVsdSB0byAlbHVcbiIKK21zZ3N0ciAi44OQ44OD44OV44Kh44K144Kk44K656+E5ZuyICVsdSDjgJwgJWx1XG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzozNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGVyaW9kIHNpemUgcmFuZ2UgZnJvbSAlbHUgdG8gJWx1XG4iCittc2dzdHIgIuODlOODquOCquODieOCteOCpOOCuuevhOWbsiAlbHUg44CcICVsdVxuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6MzU0CisjLCBjLWZvcm1hdAorbXNnaWQgIlJlcXVlc3RlZCBwZXJpb2QgdGltZSAldSB1c1xuIgorbXNnc3RyICLopoHmsYLjgZXjgozjgZ/jg5Tjg6rjgqrjg4nplbcgJXUgdXNcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjM1NworIywgYy1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gc2V0IHBlcmlvZCB0aW1lICV1IHVzIGZvciBwbGF5YmFjazogJXNcbiIKK21zZ3N0ciAi44OU44Oq44Kq44OJ6ZW3ICV1IHVzIOOCkuioreWumuOBp+OBjeOBvuOBm+OCkzogJXNcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjM2MworIywgYy1mb3JtYXQKK21zZ2lkICJSZXF1ZXN0ZWQgYnVmZmVyIHRpbWUgJXUgdXNcbiIKK21zZ3N0ciAi6KaB5rGC44GV44KM44Gf44OQ44OD44OV44Kh6ZW3ICV1IHVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzozNjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIHNldCBidWZmZXIgdGltZSAldSB1cyBmb3IgcGxheWJhY2s6ICVzXG4iCittc2dzdHIgIuODkOODg+ODleOCoemVtyAldSB1cyDjgpLoqK3lrprjgafjgY3jgb7jgZvjgpM6ICVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzozNzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiVXNpbmcgbWF4IGJ1ZmZlciBzaXplICVsdVxuIgorbXNnc3RyICLmnIDlpKfjg5Djg4Pjg5XjgqHjgrXjgqTjgrogJWx1IOOCkuS9v+eUqFxuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6Mzc4CisjLCBjLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byBzZXQgYnVmZmVyIHNpemUgJWx1IGZvciBwbGF5YmFjazogJXNcbiIKK21zZ3N0ciAi44OQ44OD44OV44Kh44K144Kk44K6ICVsdSDjgpLoqK3lrprjgafjgY3jgb7jgZvjgpM6ICVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzozODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGVyaW9kcyA9ICV1XG4iCittc2dzdHIgIuODlOODquOCquODieaVsCA9ICV1XG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzozODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIHNldCBucGVyaW9kcyAldSBmb3IgcGxheWJhY2s6ICVzXG4iCittc2dzdHIgIuODlOODquOCquODieaVsCAldSDjgpLoqK3lrprjgafjgY3jgb7jgZvjgpM6ICVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzozOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIHNldCBodyBwYXJhbXMgZm9yIHBsYXliYWNrOiAlc1xuIgorbXNnc3RyICJodyBwYXJhbXMg44KS6Kit5a6a44Gn44GN44G+44Gb44KTOiAlc1xuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6NDAyCisjLCBjLWZvcm1hdAorbXNnaWQgIndhcyBzZXQgcGVyaW9kX3NpemUgPSAlbHVcbiIKK21zZ3N0ciAicGVyaW9kX3NpemUgPSAlbHUg44Gn6Kit5a6aXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo0MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAid2FzIHNldCBidWZmZXJfc2l6ZSA9ICVsdVxuIgorbXNnc3RyICJidWZmZXJfc2l6ZSA9ICVsdSDjgafoqK3lrppcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjQwNQorIywgYy1mb3JtYXQKK21zZ2lkICJidWZmZXIgdG8gc21hbGwsIGNvdWxkIG5vdCB1c2VcbiIKK21zZ3N0ciAi44OQ44OD44OV44Kh44GM5bCP44GV44GZ44GO44G+44GZXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo0MTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGRldGVybWluZSBjdXJyZW50IHN3cGFyYW1zIGZvciBwbGF5YmFjazogJXNcbiIKK21zZ3N0ciAi54++5Zyo44GuIHN3cGFyYW1zIOOCkuWPluW+l+OBp+OBjeOBvuOBm+OCkzogJXNcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjQyNQorIywgYy1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gc2V0IHN0YXJ0IHRocmVzaG9sZCBtb2RlIGZvciBwbGF5YmFjazogJXNcbiIKK21zZ3N0ciAic3RhcnRfdGhyZXNob2xkIOODouODvOODieOCkuioreWumuOBp+OBjeOBvuOBm+OCkzogJXNcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjQzMgorIywgYy1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gc2V0IGF2YWlsIG1pbiBmb3IgcGxheWJhY2s6ICVzXG4iCittc2dzdHIgImF2YWlsX21pbiDjgpLoqK3lrprjgafjgY3jgb7jgZvjgpM6ICVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo0MzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIHNldCBzdyBwYXJhbXMgZm9yIHBsYXliYWNrOiAlc1xuIgorbXNnc3RyICLlho3nlJ/nlKjjga4gc3cgcGFyYW1zIOOCkuioreWumuOBp+OBjeOBvuOBm+OCkzogJXNcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjQ1NAorIywgYy1mb3JtYXQKK21zZ2lkICJDYW4ndCByZWNvdmVyeSBmcm9tIHVuZGVycnVuLCBwcmVwYXJlIGZhaWxlZDogJXNcbiIKK21zZ3N0ciAi44Ki44Oz44OA44O844Op44Oz44GL44KJ5b6p5biw5aSx5pWXOiAlc1xuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6NDY1CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbid0IHJlY292ZXJ5IGZyb20gc3VzcGVuZCwgcHJlcGFyZSBmYWlsZWQ6ICVzXG4iCittc2dzdHIgIuOCteOCueODmuODs+ODieOBi+OCieW+qeW4sOWkseaVlzogJXNcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjUyOSBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6OTI2CisjLCBjLWZvcm1hdAorbXNnaWQgIk5vIGVub3VnaCBtZW1vcnlcbiIKK21zZ3N0ciAi44Oh44Oi44Oq44GM6Laz44KK44G+44Gb44KTXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo1MzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IG9wZW4gV0FWIGZpbGUgJXNcbiIKK21zZ3N0ciAiV0FW44OV44Kh44Kk44Or44GM44Kq44O844OX44Oz44Gn44GN44G+44Gb44KTOiAlc1xuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6NTM4IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo1NjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW52YWxpZCBXQVYgZmlsZSAlc1xuIgorbXNnc3RyICLkuI3mraPjgapXQVbjg5XjgqHjgqTjg6vjgafjgZk6ICVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo1NDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiTm90IGEgV0FWIGZpbGU6ICVzXG4iCittc2dzdHIgIldBVuODleOCoeOCpOODq+OBp+OBr+OBguOCiuOBvuOBm+OCkzogJXNcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjU0NworIywgYy1mb3JtYXQKK21zZ2lkICJVbnN1cHBvcnRlZCBXQVYgZm9ybWF0ICVkIGZvciAlc1xuIgorbXNnc3RyICLmnKrjgrXjg53jg7zjg4jjga5XQVbjg5Xjgqnjg7zjg57jg4Pjg4ggJWQ6ICVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo1NTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgaXMgbm90IGEgbW9ubyBzdHJlYW0gKCVkIGNoYW5uZWxzKVxuIgorbXNnc3RyICIlcyDjga/jg6Ljg47jgrnjg4jjg6rjg7zjg6Djgafjga/jgYLjgorjgb7jgZvjgpMgKCVkIOODgeODo+ODjeODqylcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjU1NworIywgYy1mb3JtYXQKK21zZ2lkICJTYW1wbGUgcmF0ZSBkb2Vzbid0IG1hdGNoICglZCkgZm9yICVzXG4iCittc2dzdHIgIuOCteODs+ODl+ODq+ODrOODvOODiOOBjOS4jeS4gOiHtOOBp+OBmSglZCk6ICVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo1NjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5zdXBwb3J0ZWQgc2FtcGxlIGZvcm1hdCBiaXRzICVkIGZvciAlc1xuIgorbXNnc3RyICLmnKrjgrXjg53jg7zjg4jjga7jgrXjg7Pjg5fjg6vjg5Xjgqnjg7zjg57jg4Pjg4jjg5Pjg4Pjg4ggJWQ6ICVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo2MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5kZWZpbmVkIGNoYW5uZWwgJWRcbiIKK21zZ3N0ciAi5pyq5a6a576p44Gu44OB44Oj44ON44OrICVkXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo2NjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiV3JpdGUgZXJyb3I6ICVkLCVzXG4iCittc2dzdHIgIuabuOi+vOOCqOODqeODvDogJWQsJXNcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjY2NQorIywgYy1mb3JtYXQKK21zZ2lkICJ4cnVuX3JlY292ZXJ5IGZhaWxlZDogJWQsJXNcbiIKK21zZ3N0ciAieHJ1bl9yZWNvdmVyeSDlpLHmlZc6ICVkLCVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo3MjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlVzYWdlOiBzcGVha2VyLXRlc3QgW09QVElPTl0uLi4gXG4iCisiLWgsLS1oZWxwXHRoZWxwXG4iCisiLUQsLS1kZXZpY2VcdHBsYXliYWNrIGRldmljZVxuIgorIi1yLC0tcmF0ZVx0c3RyZWFtIHJhdGUgaW4gSHpcbiIKKyItYywtLWNoYW5uZWxzXHRjb3VudCBvZiBjaGFubmVscyBpbiBzdHJlYW1cbiIKKyItZiwtLWZyZXF1ZW5jeVx0c2luZSB3YXZlIGZyZXF1ZW5jeSBpbiBIelxuIgorIi1GLC0tZm9ybWF0XHRzYW1wbGUgZm9ybWF0XG4iCisiLWIsLS1idWZmZXJcdHJpbmcgYnVmZmVyIHNpemUgaW4gdXNcbiIKKyItcCwtLXBlcmlvZFx0cGVyaW9kIHNpemUgaW4gdXNcbiIKKyItUCwtLW5wZXJpb2RzXHRudW1iZXIgb2YgcGVyaW9kc1xuIgorIi10LC0tdGVzdFx0cGluaz11c2UgcGluayBub2lzZSwgc2luZT11c2Ugc2luZSB3YXZlLCB3YXY9V0FWIGZpbGVcbiIKKyItbCwtLW5sb29wc1x0c3BlY2lmeSBudW1iZXIgb2YgbG9vcHMgdG8gdGVzdCwgMCA9IGluZmluaXRlXG4iCisiLXMsLS1zcGVha2VyXHRzaW5nbGUgc3BlYWtlciB0ZXN0LiBWYWx1ZXMgMT1MZWZ0LCAyPXJpZ2h0LCBldGNcbiIKKyItdywtLXdhdmZpbGVcdFVzZSB0aGUgZ2l2ZW4gV0FWIGZpbGUgYXMgYSB0ZXN0IHNvdW5kXG4iCisiLVcsLS13YXZkaXJcdFNwZWNpZnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIFdBViBmaWxlc1xuIgorIlxuIgorbXNnc3RyICIiCisi5L2/55So5rOVOiBzcGVha2VyLXRlc3QgW+OCquODl+OCt+ODp+ODs10uLi5cbiIKKyItaCwtLWhlbHAgICAgICAgICAgICDjg5jjg6vjg5dcbiIKKyItRCwtLWRldmljZSAgICAgICAgICDlho3nlJ/jg4fjg5DjgqTjgrlcbiIKKyItciwtLXJhdGUgICAgICAgICAgICDjgrnjg4jjg6rjg7zjg6Djg6zjg7zjg4ggKEh6KVxuIgorIi1jLC0tY2hhbm5lbHMgICAgICAgIOODgeODo+ODjeODq+aVsFxuIgorIi1mLC0tZnJlcXVlbmN5ICAgICAgIOato+W8puazouWRqOazouaVsCAoaHopXG4iCisiLUYsLS1mb3JtYXQgICAgICAgICAg44K144Oz44OX44Or44OV44Kp44O844Oe44OD44OIXG4iCisiLWIsLS1idWZmZXIgICAgICAgICAg44Oq44Oz44Kw44OQ44OD44OV44Kh44K144Kk44K6ICjOvHMpXG4iCisiLXAsLS1wZXJpb2QgICAgICAgICAg44OU44Oq44Kq44OJ44K144Kk44K6ICjOvHMpXG4iCisiLVAsLS1ucGVyaW9kcyAgICAgICAg44OU44Oq44Kq44OJ5pWwXG4iCisiLXQsLS10ZXN0ICAgICAgICAgICAgcGluaz3jg5Tjg7Pjgq/jg47jgqTjgrrjgpLkvb/nlKgsIHNpbmU95q2j5bym5rOi44KS5L2/55SoLCB3YXY9V0FW44OV44KhIgorIuOCpOODq+WGjeeUn1xuIgorIi1sLC0tbmxvb3BzICAgICAgICAgIOe5sOOCiui/lOOBl+ODhuOCueODiOaVsCwgMCA9IOeEoeWItumZkFxuIgorIi1zLC0tc3BlYWtlciAgICAgICAgIOWNmOS4gOOCueODlOODvOOCq+ODvOODhuOCueODiCAgMT3lt6Yg44G+44Gf44GvIDI95Y+zXG4iCisiLXcsLS13YXZmaWxlICAgICAgICAg5oyH5a6a44GuV0FW44OV44Kh44Kk44Or44KS44OG44K544OI6Z+z5rqQ44Go44GX44Gm5L2/55SoXG4iCisiLVcsLS13YXZkaXIgICAgICAgICAgV0FW44OV44Kh44Kk44Or44Gu44GC44KL44OH44Kj44Os44Kv44OI44Oq44KS5oyH5a6aXG4iCisiXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo4MzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW52YWxpZCBudW1iZXIgb2YgcGVyaW9kcyAlZFxuIgorbXNnc3RyICLkuI3mraPjgarjg5Tjg6rjgqrjg4nmlbAgJWRcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjg0OSBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6ODUzCisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgdGVzdCB0eXBlICVzXG4iCittc2dzdHIgIuS4jeato+OBquODhuOCueODiOOCv+OCpOODlyAlc1xuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6ODY1CisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgcGFyYW1ldGVyIGZvciAtcyBvcHRpb24uXG4iCittc2dzdHIgIi1zIOOCquODl+OCt+ODp+ODs+OBruWApOOBjOS4jeato+OBp+OBmVxuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6ODc2CisjLCBjLWZvcm1hdAorbXNnaWQgIlVua25vd24gb3B0aW9uICclYydcbiIKK21zZ3N0ciAi5pyq55+l44Gu44Kq44OX44K344On44OzICclYydcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjg5MAorIywgYy1mb3JtYXQKK21zZ2lkICJQbGF5YmFjayBkZXZpY2UgaXMgJXNcbiIKK21zZ3N0ciAi5YaN55Sf44OH44OQ44Kk44K5OiAlc1xuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6ODkxCisjLCBjLWZvcm1hdAorbXNnaWQgIlN0cmVhbSBwYXJhbWV0ZXJzIGFyZSAlaUh6LCAlcywgJWkgY2hhbm5lbHNcbiIKK21zZ3N0ciAi44K544OI44Oq44O844Og44OR44Op44Oh44O844K/OiAlaUh6LCAlcywgJWkg44OB44Oj44ON44OrXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo4OTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiVXNpbmcgMTYgb2N0YXZlcyBvZiBwaW5rIG5vaXNlXG4iCittc2dzdHIgIjE2IOOCquOCr+OCv+ODvOODluOBruODlOODs+OCr+ODjuOCpOOCuuOCkuS9v+eUqFxuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6ODk3CisjLCBjLWZvcm1hdAorbXNnaWQgIlNpbmUgd2F2ZSByYXRlIGlzICUuNGZIelxuIgorbXNnc3RyICLmraPlvKbms6Ljg6zjg7zjg4g6ICUuNGZIelxuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6OTAwCisjLCBjLWZvcm1hdAorbXNnaWQgIldBViBmaWxlKHMpXG4iCittc2dzdHIgIldBViDjg5XjgqHjgqTjg6tcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjkwNgorIywgYy1mb3JtYXQKK21zZ2lkICJQbGF5YmFjayBvcGVuIGVycm9yOiAlZCwlc1xuIgorbXNnc3RyICLlho3nlJ/jgqrjg7zjg5fjg7Pjgqjjg6njg7w6ICVkLCVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo5MTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2V0dGluZyBvZiBod3BhcmFtcyBmYWlsZWQ6ICVzXG4iCittc2dzdHIgImh3cGFyYW1zIOOBruioreWumuOBq+WkseaVlzogJXNcbiIKKworIzogc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jOjkxNgorIywgYy1mb3JtYXQKK21zZ2lkICJTZXR0aW5nIG9mIHN3cGFyYW1zIGZhaWxlZDogJXNcbiIKK21zZ3N0ciAic3dwYXJhbXMg44Gu6Kit5a6a44Gr5aSx5pWXOiAlc1xuIgorCisjOiBzcGVha2VyLXRlc3Qvc3BlYWtlci10ZXN0LmM6OTU3IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo5NzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiVHJhbnNmZXIgZmFpbGVkOiAlc1xuIgorbXNnc3RyICLou6LpgIHjgavlpLHmlZfjgZfjgb7jgZfjgZ86ICVzXG4iCisKKyM6IHNwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYzo5NjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGltZSBwZXIgcGVyaW9kID0gJWxmXG4iCittc2dzdHIgIuODlOODquOCquODieaZgumWkyA9ICVsZlxuIgpkaWZmIC0tZ2l0IGEvc2VxL01ha2VmaWxlLmFtIGIvc2VxL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjODRjZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXEvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSBAQAorU1VCRElSUz1hY29ubmVjdCBhcGxheW1pZGkgYXNlcWR1bXAgYXNlcW5ldApkaWZmIC0tZ2l0IGEvc2VxL2Fjb25uZWN0L01ha2VmaWxlLmFtIGIvc2VxL2Fjb25uZWN0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwN2I5ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXEvYWNvbm5lY3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw3IEBACitJTkNMVURFUyA9IC1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlCitFWFRSQV9ESVNUID0gUkVBRE1FLmFjb25uZWN0IGFjb25uZWN0LjEKK0xEQUREID0gJChMSUJJTlRMKQorCitiaW5fUFJPR1JBTVMgPSBhY29ubmVjdAorYWNvbm5lY3RfU09VUkNFUyA9IGFjb25uZWN0LmMKK21hbl9NQU5TID0gYWNvbm5lY3QuMQpkaWZmIC0tZ2l0IGEvc2VxL2Fjb25uZWN0L1JFQURNRS5hY29ubmVjdCBiL3NlcS9hY29ubmVjdC9SRUFETUUuYWNvbm5lY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY2MjM3YQotLS0gL2Rldi9udWxsCisrKyBiL3NlcS9hY29ubmVjdC9SRUFETUUuYWNvbm5lY3QKQEAgLTAsMCArMSw0NiBAQAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCWFjb25uZWN0IC0gY29udHJvbCBzdWJzY3JpcHRpb25zCisJCXZlci4wLjEuMworCUNvcHlyaWdodCAoQykgMTk5OS0yMDAwIFRha2FzaGkgSXdhaQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCithY29ubmVjdCBpcyBhIHV0aWxpdHkgdG8gY29udHJvbCBzdWJzY3JpcHRpb25zIG9mIHR3byBwb3J0cyBhcyB0aGUKK3RoaXJkICJtYW5hZ2VyIiBjbGllbnQuCisKK0ZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvbm5lY3RzIHR3byBwb3J0cywgZnJvbSA2NDowIHRvIDY1OjAuCisKKwklIGFjb25uZWN0IDY0OjAgNjU6MAorCitUbyBkaXNjb25uZWN0IHRoZSBleGlzdGluZyBzdWJzY3JpcHRpb24sIHVzZSAtZCBvcHRpb24uCisKKwklIGFjb25uZWN0IC1kIDY0OjAgNjU6MAorCitUbyBzZWUgd2hpY2ggcG9ydCBpcyBhdmFpbGFibGUgYXMgaW5wdXQgcG9ydCwgcnVuIHRoZSBmb2xsb3dpbmcKK2NvbW1hbmQ6CisKKwklIGFjb25uZWN0IC1pCisJY2xpZW50IDA6ICdTeXN0ZW0nIFt0eXBlPWtlcm5lbF0KKwkgICAgMCAnVGltZXIgICAgICAgICAgICcKKwkgICAgMSAnQW5ub3VuY2UgICAgICAgICcKKwljbGllbnQgNjQ6ICcwOiBNSURJIFN5bnRoJyBbdHlwZT1rZXJuZWxdCisJICAgIDAgJ2NhcmQgMDogc3ludGgtbWlkaTogMCcKKworU2ltaWxhcnksIHRvIHNlZSB0aGUgb3V0cHV0IHBvcnRzLCB1c2UgLW8gZmxhZy4KKworCSUgYWNvbm5lY3QgLW8KKwljbGllbnQgNjQ6ICcwOiBNSURJIFN5bnRoJyBbdHlwZT1rZXJuZWxdCisJICAgIDAgJ2NhcmQgMDogc3ludGgtbWlkaTogMCcKKwljbGllbnQgNjU6ICdBV0UgV2F2ZSBUYWJsZSBTeW50aCA6IDAnIFt0eXBlPWtlcm5lbF0KKwkgICAgMCAnRW11ODAwMCBwb3J0IDAgICcKKwkgICAgMSAnRW11ODAwMCBwb3J0IDEgICcKKwkgICAgMiAnRW11ODAwMCBwb3J0IDIgICcKKwkgICAgMyAnRW11ODAwMCBwb3J0IDMgICcKKworVGhlIG9wdGlvbiAtbCB0b2dldGhlciB3aXRoIC1pIG9yIC1vIHNob3dzIHN1YnNjcmliZXJzIGZvciBlYWNoIHBvcnQuCisKK1BvcnRzIGFyZSBjb25uZWN0ZWQgZXhjbHVzaXZlbHkgd2hlbiB0aGUgb3B0aW9uIC1lIGlzIHNwZWNpZmllZC4KKworRm9yIG1vZGlmeWluZyB0aW1lLXN0YW1wIHdpdGggYSBxdWV1ZSwgdXNlIC1yIG9yIC10IG9wdGlvbiBmb2xsb3dlZCBieQorYSBxdWV1ZSBpbmRleCB3aGljaCB1cGRhdGVzIHRoZSB0aW1lLXN0YW1wLiAgRm9ybWVyIHVzZXMgcmVhbC10aW1lIHF1ZXVlLAord2hpbGUgdGhlIGxhdHRlciB1c2VzIHRpY2sgcXVldWUuICBUaGUgcXVldWUgbXVzdCBiZSB1c2VkIChub3QgbmVjZXNzYXJpbHkKK293bmVkKSBieSB0aGUgcmVjZWl2ZXIgY2xpZW50LgpkaWZmIC0tZ2l0IGEvc2VxL2Fjb25uZWN0L2Fjb25uZWN0LjEgYi9zZXEvYWNvbm5lY3QvYWNvbm5lY3QuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDUwMTg3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VxL2Fjb25uZWN0L2Fjb25uZWN0LjEKQEAgLTAsMCArMSwxNDUgQEAKKy5USCBhY29ubmVjdCAxICJBdWd1c3QgMzEsIDIwMDAiCisuZGUgRVgKKy5uZgorLmZ0IENXCisuLgorLmRlIEVFCisuZnQgUgorLmZpCisuLgorLlNIIE5BTUUKK2Fjb25uZWN0IFwtIEFMU0Egc2VxdWVuY2VyIGNvbm5lY3Rpb24gbWFuYWdlcgorCisuU0ggU1lOT1BTSVMKKy5CIGFjb25uZWN0CitbXC1kXSBbXC1vcHRpb25zXSBzZW5kZXIgcmVjZWl2ZXIKKy5icgorLkIgYWNvbm5lY3QKK1wtaXxcLW8gW1wtb3B0aW9uc10KKy5icgorLkIgYWNvbm5lY3QKK1wteAorCisuU0ggREVTQ1JJUFRJT04KKy5CIGFjb25uZWN0CitpcyBhIHV0aWxpdHkgdG8gY29ubmVjdCBhbmQgZGlzY29ubmVjdCB0d28gZXhpc3RpbmcgcG9ydHMgb24gQUxTQSBzZXF1ZW5jZXIKK3N5c3RlbS4KK1RoZSBwb3J0cyB3aXRoIHRoZSBhcmJpdHJhcnkgc3Vic2NyaXB0aW9uIHBlcm1pc3Npb24sIHN1Y2ggYXMgY3JlYXRlZAorYnkKKy5CIGFzZXF2aWV3KDEpLAorY2FuIGJlIGNvbm5lY3RlZCB0byBhbnkgKE1JREkpIGRldmljZSBwb3J0cyB1c2luZworLkIgYWNvbm5lY3QuCitGb3IgZXhhbXBsZSwgdG8gY29ubmVjdCBmcm9tIHBvcnQgNjQ6MCB0byA2NTowLCBydW4gYXMgZm9sbG93czoKKy5JUCAiIiA0CislIGFjb25uZWN0IDY0OjAgNjU6MAorLlBQCitUaGUgY29ubmVjdGlvbiBpcyBvbmUtd2F5LCBhbmQgdGhlIHdob2xlIGRhdGEgdG8gdGhlIHNlbmRlciBwb3J0ICg2NDowKQoraXMgcmVkaXJlY3RlZCB0byB0aGUgcmVjZWl2ZXIgcG9ydCAoNjU6MCkuICBXaGVuIGFub3RoZXIgcG9ydCAoZS5nLiA2NToxKQoraXMgYXR0YWNoZWQgdG8gdGhlIHNhbWUgc2VuZGVyIHBvcnQsIHRoZSBkYXRhIGlzIHNlbnQgdG8gYm90aCByZWNlaXZlcgorcG9ydHMuCitGb3IgZGlzY29ubmVjdGlvbiwgdXNlCisuQiBcLWQKK29wdGlvbi4KKy5zcAorLkVYCislIGFjb25uZWN0IFwtZCA2NDowIDY1OjAKKy5FRQorLlBQCitUaGUgYWRkcmVzcyBjYW4gYmUgZ2l2ZW4gdXNpbmcgdGhlIGNsaWVudCdzIG5hbWUuCisuc3AKKy5FWAorJSBhY29ubmVjdCBFeHRlcm5hbDowIEVtdTgwMDA6MQorLkVFCisuUFAKK1RoZW4gdGhlIHBvcnQgMCBvZiB0aGUgY2xpZW50IG1hdGNoaW5nIHdpdGggdGhlIHN0cmluZyAiRXh0ZXJuYWwiIGlzCitjb25uZWN0ZWQgdG8gdGhlIHBvcnQgMSBvZiB0aGUgY2xpZW50IG1hdGNoaW5nIHdpdGggdGhlICJFbXU4MDAwIi4KKy5QUAorQW5vdGhlciBmdW5jdGlvbiBvZgorLkIgYWNvbm5lY3QKK2lzIHRvIGxpc3QgdGhlIHByZXNlbnQgcG9ydHMKK29uIHRoZSBnaXZlbiBjb25kaXRpb24uCitUaGUgaW5wdXQgcG9ydHMsIHdoaWNoIG1heSBiZWNvbWUKKy5JIHNlbmRlcgorcG9ydHMsIGNhbiBiZSBsaXN0ZWQgd2l0aAorLkIgXC1pCitvcHRpb24uCisuc3AKKy5FWAorJSBhY29ubmVjdCBcLWkKK2NsaWVudCAwOiAnU3lzdGVtJyBbdHlwZT1rZXJuZWxdCisgICAgMCAnVGltZXIgICAgICAgICAgICcKKyAgICAxICdBbm5vdW5jZSAgICAgICAgJworY2xpZW50IDY0OiAnRXh0ZXJuYWwgTUlESVwtMCcgW3R5cGU9a2VybmVsXQorICAgIDAgJ01JREkgMFwtMCAgICAgICAgJworLkVFCisuUFAKK1NpbWlsYXJseSwgdG8gc2VlIHRoZSBvdXRwdXQgcG9ydHMsIHVzZQorLkIgXC1vCitmbGFnLgorLlBQCitZb3UgY2FuIHJlbW92ZSBhbGwgZXhpc3RpbmcgZXhwb3J0ZWQgY29ubmVjdGlvbnMgdXNpbmcKKy5CIFwteAorb3B0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgZm9yIHRlcm1pbmF0aW5nIHRoZSBBTFNBIGRyaXZlcnMsCitiZWNhdXNlIHRoZSBtb2R1bGVzIHdpdGggc2VxdWVuY2VyIGNvbm5lY3Rpb25zIGNhbm5vdCBiZSB1bmxvYWRlZAordW5sZXNzIHRoZWlyIGNvbm5lY3Rpb25zIGFyZSByZW1vdmVkLgorCisuU0ggT1BUSU9OUworLlNTIENPTk5FQ1RJT04gTUFOQUdFTUVOVAorLlRQCisuQiBcLWQsIFwtXC1kaXNjb25uZWN0CitEaXNjb25uZWN0IHRoZSBnaXZlbiBzdWJzY3JpcHRpb24uCisuVFAKKy5CIFwtZSwgXC1cLWV4Y2x1c2l2ZQorQ29ubmVjdCBwb3J0cyB3aXRoIGV4Y2x1c2l2ZSBtb2RlLgorQm90aCBzZW5kZXIgYW5kIHJlY2VpdmVyIHBvcnRzIGNhbiBiZSBubyBsb25nZXIgY29ubmVjdGVkIGJ5IGFueSBvdGhlciBwb3J0cy4KKy5UUAorLkIgXC1yLCBcLVwtcmVhbCBxdWV1ZQorQ29udmVydCB0aW1lLXN0YW1wcyBvZiBldmVudCBwYWNrZXRzIHRvIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBnaXZlbgorLkkgcmVhbC10aW1lCitxdWV1ZS4KK1RoaXMgaXMgb3B0aW9uIGlzLCBob3dldmVyLCBub3Qgc28gdXNlZnVsLCBzaW5jZQordGhlIHJlY2VpdmVyIHBvcnQgbXVzdCB1c2UgKG5vdCBuZWNlc3NhcmlseSBvd24pIHRoZSBzcGVjaWZpZWQgcXVldWUuCisuVFAKKy5CIFwtdCwgXC1cLXRpY2sgcXVldWUKK0xpa2UKKy5CIFwtcgorb3B0aW9uLCBidXQgCit0aW1lLXN0YW1wcyBhcmUgY29udmVydGVkIHRvIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBnaXZlbgorLkkgdGljaworcXVldWUuCisKKy5TUyBMSVNUIFBPUlRTCisuVFAKKy5CIFwtaSwgXC1cLWlucHV0CitMaXN0IGV4aXN0aW5nIGlucHV0IChyZWFkYWJsZSkgcG9ydHMuCitUaGlzIG9wdGlvbiBpcyBleGNsdXNpdmUgdG8KKy5CIFwtby4KKy5UUAorLkIgXC1vLCBcLVwtb3V0cHV0CitMaXN0IGV4aXN0aW5nIG91dHB1dCAod3JpdGFibGUpIHBvcnRzLgorVGhpcyBvcHRpb24gaXMgZXhjbHVzaXZlIHRvCisuQiBcLWkuCisuVFAKKy5CIFwtbCwgXC1cLWxpc3QKK0xpc3QgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiBzdGF0dXMuICBUaGUgY29ubmVjdGVkIGFuZCBjb25uZWN0aW5nIHBvcnRzCitmcm9tL3RvIGVhY2ggcG9ydCBhcmUgbGlzdGVkIHRvZ2V0aGVyLgorVGhlIHN1ZmZpeCBmbGFnCisuQiBbZXhdCittZWFucyB0aGUgY29ubmVjdGlvbiBpcyBleGNsdXNpdmUuCitUaGUgc3VmZml4IGZsYWcKKy5CIFtyZWFsOiNdCithbmQKKy5CIFt0aWNrOiNdCittZWFuIHRoZSBjb25uZWN0aW9uIGluY2x1ZGVzIHJlYWwtdGltZSBhbmQgdGljayBjb252ZXJzaW9uIG9uIHRoZSBsaXN0ZWQKK3F1ZXVlLCByZXNwZWN0aXZlbHkuCisKKy5TUyBSRU1PVkUgQUxMIENPTk5FQ1RJT05TCisuVFAKKy5CIFwteCwgXC1cLXJlbW92ZWFsbAorUmVtb3ZlIGFsbCBleHBvcnRlZCBjb25uZWN0aW9ucy4KKworLlNIICJTRUUgQUxTTyIKK2FzZXFuZXQoMSksIGFzZXF2aWV3KDEpCisKKy5TSCBBVVRIT1IKK1Rha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KZGlmZiAtLWdpdCBhL3NlcS9hY29ubmVjdC9hY29ubmVjdC5jIGIvc2VxL2Fjb25uZWN0L2Fjb25uZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM2NmNmZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcS9hY29ubmVjdC9hY29ubmVjdC5jCkBAIC0wLDAgKzEsMzkyIEBACisvKgorICogY29ubmVjdCAvIGRpc2Nvbm5lY3QgdHdvIHN1YnNjcmliZXIgcG9ydHMKKyAqICAgdmVyLjAuMS4zCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5IFRha2FzaGkgSXdhaQorICogCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8bG9jYWxlLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8YWxzYS9hc291bmRsaWIuaD4KKyNpbmNsdWRlICJhY29uZmlnLmgiCisjaW5jbHVkZSAiZ2V0dGV4dC5oIgorCitzdGF0aWMgdm9pZCBlcnJvcl9oYW5kbGVyKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jdGlvbiwgaW50IGVyciwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmc7CisKKwlpZiAoZXJyID09IEVOT0VOVCkJLyogSWdub3JlIHRob3NlIG1pc2xlYWRpbmcgIndhcm5pbmdzIiAqLworCQlyZXR1cm47CisJdmFfc3RhcnQoYXJnLCBmbXQpOworCWZwcmludGYoc3RkZXJyLCAiQUxTQSBsaWIgJXM6JWk6KCVzKSAiLCBmaWxlLCBsaW5lLCBmdW5jdGlvbik7CisJdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZyk7CisJaWYgKGVycikKKwkJZnByaW50ZihzdGRlcnIsICI6ICVzIiwgc25kX3N0cmVycm9yKGVycikpOworCXB1dGMoJ1xuJywgc3RkZXJyKTsKKwl2YV9lbmQoYXJnKTsKK30KKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlwcmludGYoXygiYWNvbm5lY3QgLSBBTFNBIHNlcXVlbmNlciBjb25uZWN0aW9uIG1hbmFnZXJcbiIpKTsKKwlwcmludGYoXygiQ29weXJpZ2h0IChDKSAxOTk5LTIwMDAgVGFrYXNoaSBJd2FpXG4iKSk7CisJcHJpbnRmKF8oIlVzYWdlOlxuIikpOworCXByaW50ZihfKCIgKiBDb25uZWN0aW9uL2Rpc2Nvbm5lY3Rpb24gYmV0d2VlbiB0d28gcG9ydHNcbiIpKTsKKwlwcmludGYoXygiICAgYWNvbm5lY3QgWy1vcHRpb25zXSBzZW5kZXIgcmVjZWl2ZXJcbiIpKTsKKwlwcmludGYoXygiICAgICBzZW5kZXIsIHJlY2VpdmVyID0gY2xpZW50OnBvcnQgcGFpclxuIikpOworCXByaW50ZihfKCIgICAgIC1kLC0tZGlzY29ubmVjdCAgICAgZGlzY29ubmVjdFxuIikpOworCXByaW50ZihfKCIgICAgIC1lLC0tZXhjbHVzaXZlICAgICAgZXhjbHVzaXZlIGNvbm5lY3Rpb25cbiIpKTsKKwlwcmludGYoXygiICAgICAtciwtLXJlYWwgIyAgICAgICAgIGNvbnZlcnQgcmVhbC10aW1lLXN0YW1wIG9uIHF1ZXVlXG4iKSk7CisJcHJpbnRmKF8oIiAgICAgLXQsLS10aWNrICMgICAgICAgICBjb252ZXJ0IHRpY2stdGltZS1zdGFtcCBvbiBxdWV1ZVxuIikpOworCXByaW50ZihfKCIgKiBMaXN0IGNvbm5lY3RlZCBwb3J0cyAobm8gc3Vic2NyaXB0aW9uIGFjdGlvbilcbiIpKTsKKwlwcmludGYoXygiICAgYWNvbm5lY3QgLWl8LW8gWy1vcHRpb25zXVxuIikpOworCXByaW50ZihfKCIgICAgIC1pLC0taW5wdXQgICAgICAgICAgbGlzdCBpbnB1dCAocmVhZGFibGUpIHBvcnRzXG4iKSk7CisJcHJpbnRmKF8oIiAgICAgLW8sLS1vdXRwdXQgICAgICAgICBsaXN0IG91dHB1dCAod3JpdGFibGUpIHBvcnRzXG4iKSk7CisJcHJpbnRmKF8oIiAgICAgLWwsLS1saXN0ICAgICAgICAgICBsaXN0IGN1cnJlbnQgY29ubmVjdGlvbnMgb2YgZWFjaCBwb3J0XG4iKSk7CisJcHJpbnRmKF8oIiAqIFJlbW92ZSBhbGwgZXhwb3J0ZWQgY29ubmVjdGlvbnNcbiIpKTsKKwlwcmludGYoXygiICAgICAteCwgLS1yZW1vdmVhbGxcbiIpKTsKK30KKworLyoKKyAqIGNoZWNrIHBlcm1pc3Npb24gKGNhcGFiaWxpdHkpIG9mIHNwZWNpZmllZCBwb3J0CisgKi8KKworI2RlZmluZSBMSVNUX0lOUFVUCTEKKyNkZWZpbmUgTElTVF9PVVRQVVQJMgorCisjZGVmaW5lIHBlcm1fb2socGluZm8sYml0cykgKChzbmRfc2VxX3BvcnRfaW5mb19nZXRfY2FwYWJpbGl0eShwaW5mbykgJiAoYml0cykpID09IChiaXRzKSkKKworc3RhdGljIGludCBjaGVja19wZXJtaXNzaW9uKHNuZF9zZXFfcG9ydF9pbmZvX3QgKnBpbmZvLCBpbnQgcGVybSkKK3sKKwlpZiAocGVybSkgeworCQlpZiAocGVybSAmIExJU1RfSU5QVVQpIHsKKwkJCWlmIChwZXJtX29rKHBpbmZvLCBTTkRfU0VRX1BPUlRfQ0FQX1JFQUR8U05EX1NFUV9QT1JUX0NBUF9TVUJTX1JFQUQpKQorCQkJCWdvdG8gX19vazsKKwkJfQorCQlpZiAocGVybSAmIExJU1RfT1VUUFVUKSB7CisJCQlpZiAocGVybV9vayhwaW5mbywgU05EX1NFUV9QT1JUX0NBUF9XUklURXxTTkRfU0VRX1BPUlRfQ0FQX1NVQlNfV1JJVEUpKQorCQkJCWdvdG8gX19vazsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisgX19vazoKKwlpZiAoc25kX3NlcV9wb3J0X2luZm9fZ2V0X2NhcGFiaWxpdHkocGluZm8pICYgU05EX1NFUV9QT1JUX0NBUF9OT19FWFBPUlQpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKgorICogbGlzdCBzdWJzY3JpYmVycyBvZiBzcGVjaWZpZWQgdHlwZQorICovCitzdGF0aWMgdm9pZCBsaXN0X2VhY2hfc3VicyhzbmRfc2VxX3QgKnNlcSwgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqc3VicywgaW50IHR5cGUsIGNvbnN0IGNoYXIgKm1zZykKK3sKKwlpbnQgY291bnQgPSAwOworCXNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3NldF90eXBlKHN1YnMsIHR5cGUpOworCXNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3NldF9pbmRleChzdWJzLCAwKTsKKwl3aGlsZSAoc25kX3NlcV9xdWVyeV9wb3J0X3N1YnNjcmliZXJzKHNlcSwgc3VicykgPj0gMCkgeworCQljb25zdCBzbmRfc2VxX2FkZHJfdCAqYWRkcjsKKwkJaWYgKGNvdW50KysgPT0gMCkKKwkJCXByaW50ZigiXHQlczogIiwgbXNnKTsKKwkJZWxzZQorCQkJcHJpbnRmKCIsICIpOworCQlhZGRyID0gc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfZ2V0X2FkZHIoc3Vicyk7CisJCXByaW50ZigiJWQ6JWQiLCBhZGRyLT5jbGllbnQsIGFkZHItPnBvcnQpOworCQlpZiAoc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfZ2V0X2V4Y2x1c2l2ZShzdWJzKSkKKwkJCXByaW50ZigiW2V4XSIpOworCQlpZiAoc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfZ2V0X3RpbWVfdXBkYXRlKHN1YnMpKQorCQkJcHJpbnRmKCJbJXM6JWRdIiwKKwkJCSAgICAgICAoc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfZ2V0X3RpbWVfcmVhbChzdWJzKSA/ICJyZWFsIiA6ICJ0aWNrIiksCisJCQkgICAgICAgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfZ2V0X3F1ZXVlKHN1YnMpKTsKKwkJc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfc2V0X2luZGV4KHN1YnMsIHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX2dldF9pbmRleChzdWJzKSArIDEpOworCX0KKwlpZiAoY291bnQgPiAwKQorCQlwcmludGYoIlxuIik7Cit9CisKKy8qCisgKiBsaXN0IHN1YnNjcmliZXJzCisgKi8KK3N0YXRpYyB2b2lkIGxpc3Rfc3Vic2NyaWJlcnMoc25kX3NlcV90ICpzZXEsIGNvbnN0IHNuZF9zZXFfYWRkcl90ICphZGRyKQoreworCXNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3QgKnN1YnM7CisJc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfYWxsb2NhKCZzdWJzKTsKKwlzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV9zZXRfcm9vdChzdWJzLCBhZGRyKTsKKwlsaXN0X2VhY2hfc3VicyhzZXEsIHN1YnMsIFNORF9TRVFfUVVFUllfU1VCU19SRUFELCBfKCJDb25uZWN0aW5nIFRvIikpOworCWxpc3RfZWFjaF9zdWJzKHNlcSwgc3VicywgU05EX1NFUV9RVUVSWV9TVUJTX1dSSVRFLCBfKCJDb25uZWN0ZWQgRnJvbSIpKTsKK30KKworLyoKKyAqIHNlYXJjaCBhbGwgcG9ydHMKKyAqLwordHlwZWRlZiB2b2lkICgqYWN0aW9uX2Z1bmNfdCkoc25kX3NlcV90ICpzZXEsIHNuZF9zZXFfY2xpZW50X2luZm9fdCAqY2luZm8sIHNuZF9zZXFfcG9ydF9pbmZvX3QgKnBpbmZvLCBpbnQgY291bnQpOworCitzdGF0aWMgdm9pZCBkb19zZWFyY2hfcG9ydChzbmRfc2VxX3QgKnNlcSwgaW50IHBlcm0sIGFjdGlvbl9mdW5jX3QgZG9fYWN0aW9uKQoreworCXNuZF9zZXFfY2xpZW50X2luZm9fdCAqY2luZm87CisJc25kX3NlcV9wb3J0X2luZm9fdCAqcGluZm87CisJaW50IGNvdW50OworCisJc25kX3NlcV9jbGllbnRfaW5mb19hbGxvY2EoJmNpbmZvKTsKKwlzbmRfc2VxX3BvcnRfaW5mb19hbGxvY2EoJnBpbmZvKTsKKwlzbmRfc2VxX2NsaWVudF9pbmZvX3NldF9jbGllbnQoY2luZm8sIC0xKTsKKwl3aGlsZSAoc25kX3NlcV9xdWVyeV9uZXh0X2NsaWVudChzZXEsIGNpbmZvKSA+PSAwKSB7CisJCS8qIHJlc2V0IHF1ZXJ5IGluZm8gKi8KKwkJc25kX3NlcV9wb3J0X2luZm9fc2V0X2NsaWVudChwaW5mbywgc25kX3NlcV9jbGllbnRfaW5mb19nZXRfY2xpZW50KGNpbmZvKSk7CisJCXNuZF9zZXFfcG9ydF9pbmZvX3NldF9wb3J0KHBpbmZvLCAtMSk7CisJCWNvdW50ID0gMDsKKwkJd2hpbGUgKHNuZF9zZXFfcXVlcnlfbmV4dF9wb3J0KHNlcSwgcGluZm8pID49IDApIHsKKwkJCWlmIChjaGVja19wZXJtaXNzaW9uKHBpbmZvLCBwZXJtKSkgeworCQkJCWRvX2FjdGlvbihzZXEsIGNpbmZvLCBwaW5mbywgY291bnQpOworCQkJCWNvdW50Kys7CisJCQl9CisJCX0KKwl9Cit9CisKKworc3RhdGljIHZvaWQgcHJpbnRfcG9ydChzbmRfc2VxX3QgKnNlcSwgc25kX3NlcV9jbGllbnRfaW5mb190ICpjaW5mbywKKwkJICAgICAgIHNuZF9zZXFfcG9ydF9pbmZvX3QgKnBpbmZvLCBpbnQgY291bnQpCit7CisJaWYgKCEgY291bnQpIHsKKwkJcHJpbnRmKF8oImNsaWVudCAlZDogJyVzJyBbdHlwZT0lc11cbiIpLAorCQkgICAgICAgc25kX3NlcV9jbGllbnRfaW5mb19nZXRfY2xpZW50KGNpbmZvKSwKKwkJICAgICAgIHNuZF9zZXFfY2xpZW50X2luZm9fZ2V0X25hbWUoY2luZm8pLAorCQkgICAgICAgKHNuZF9zZXFfY2xpZW50X2luZm9fZ2V0X3R5cGUoY2luZm8pID09IFNORF9TRVFfVVNFUl9DTElFTlQgPworCQkJXygidXNlciIpIDogXygia2VybmVsIikpKTsKKwl9CisJcHJpbnRmKCIgICUzZCAnJS0xNnMnXG4iLAorCSAgICAgICBzbmRfc2VxX3BvcnRfaW5mb19nZXRfcG9ydChwaW5mbyksCisJICAgICAgIHNuZF9zZXFfcG9ydF9pbmZvX2dldF9uYW1lKHBpbmZvKSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3BvcnRfYW5kX3N1YnMoc25kX3NlcV90ICpzZXEsIHNuZF9zZXFfY2xpZW50X2luZm9fdCAqY2luZm8sCisJCQkJc25kX3NlcV9wb3J0X2luZm9fdCAqcGluZm8sIGludCBjb3VudCkKK3sKKwlwcmludF9wb3J0KHNlcSwgY2luZm8sIHBpbmZvLCBjb3VudCk7CisJbGlzdF9zdWJzY3JpYmVycyhzZXEsIHNuZF9zZXFfcG9ydF9pbmZvX2dldF9hZGRyKHBpbmZvKSk7Cit9CisKKworLyoKKyAqIHJlbW92ZSBhbGwgKGV4cG9ydGVkKSBjb25uZWN0aW9ucworICovCitzdGF0aWMgdm9pZCByZW1vdmVfY29ubmVjdGlvbihzbmRfc2VxX3QgKnNlcSwgc25kX3NlcV9jbGllbnRfaW5mb190ICpjaW5mbywKKwkJCSAgICAgIHNuZF9zZXFfcG9ydF9pbmZvX3QgKnBpbmZvLCBpbnQgY291bnQpCit7CisJc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqcXVlcnk7CisJc25kX3NlcV9wb3J0X2luZm9fdCAqcG9ydDsKKwlzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3QgKnN1YnM7CisKKwlzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV9hbGxvY2EoJnF1ZXJ5KTsKKwlzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV9zZXRfcm9vdChxdWVyeSwgc25kX3NlcV9wb3J0X2luZm9fZ2V0X2FkZHIocGluZm8pKTsKKwlzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV9zZXRfdHlwZShxdWVyeSwgU05EX1NFUV9RVUVSWV9TVUJTX1JFQUQpOworCXNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3NldF9pbmRleChxdWVyeSwgMCk7CisKKwlzbmRfc2VxX3BvcnRfaW5mb19hbGxvY2EoJnBvcnQpOworCXNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfYWxsb2NhKCZzdWJzKTsKKworCXdoaWxlIChzbmRfc2VxX3F1ZXJ5X3BvcnRfc3Vic2NyaWJlcnMoc2VxLCBxdWVyeSkgPj0gMCkgeworCQljb25zdCBzbmRfc2VxX2FkZHJfdCAqc2VuZGVyID0gc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfZ2V0X3Jvb3QocXVlcnkpOworCQljb25zdCBzbmRfc2VxX2FkZHJfdCAqZGVzdCA9IHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX2dldF9hZGRyKHF1ZXJ5KTsKKworCQlpZiAoc25kX3NlcV9nZXRfYW55X3BvcnRfaW5mbyhzZXEsIGRlc3QtPmNsaWVudCwgZGVzdC0+cG9ydCwgcG9ydCkgPCAwIHx8CisJCSAgICAhKHNuZF9zZXFfcG9ydF9pbmZvX2dldF9jYXBhYmlsaXR5KHBvcnQpICYgU05EX1NFUV9QT1JUX0NBUF9TVUJTX1dSSVRFKSB8fAorCQkgICAgKHNuZF9zZXFfcG9ydF9pbmZvX2dldF9jYXBhYmlsaXR5KHBvcnQpICYgU05EX1NFUV9QT1JUX0NBUF9OT19FWFBPUlQpKSB7CisJCQlzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV9zZXRfaW5kZXgocXVlcnksIHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX2dldF9pbmRleChxdWVyeSkgKyAxKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfc2V0X3F1ZXVlKHN1YnMsIHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX2dldF9xdWV1ZShxdWVyeSkpOworCQlzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3NldF9zZW5kZXIoc3Vicywgc2VuZGVyKTsKKwkJc25kX3NlcV9wb3J0X3N1YnNjcmliZV9zZXRfZGVzdChzdWJzLCBkZXN0KTsKKwkJaWYgKHNuZF9zZXFfdW5zdWJzY3JpYmVfcG9ydChzZXEsIHN1YnMpIDwgMCkgeworCQkJc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfc2V0X2luZGV4KHF1ZXJ5LCBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV9nZXRfaW5kZXgocXVlcnkpICsgMSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9hbGxfY29ubmVjdGlvbnMoc25kX3NlcV90ICpzZXEpCit7CisJZG9fc2VhcmNoX3BvcnQoc2VxLCAwLCByZW1vdmVfY29ubmVjdGlvbik7Cit9CisKKworLyoKKyAqIG1haW4uLgorICovCisKK2VudW0geworCVNVQlNDUklCRSwgVU5TVUJTQ1JJQkUsIExJU1QsIFJFTU9WRV9BTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uW10gPSB7CisJeyJkaXNjb25uZWN0IiwgMCwgTlVMTCwgJ2QnfSwKKwl7ImlucHV0IiwgMCwgTlVMTCwgJ2knfSwKKwl7Im91dHB1dCIsIDAsIE5VTEwsICdvJ30sCisJeyJyZWFsIiwgMSwgTlVMTCwgJ3InfSwKKwl7InRpY2siLCAxLCBOVUxMLCAndCd9LAorCXsiZXhjbHVzaXZlIiwgMCwgTlVMTCwgJ2UnfSwKKwl7Imxpc3QiLCAwLCBOVUxMLCAnbCd9LAorCXsicmVtb3ZlYWxsIiwgMCwgTlVMTCwgJ3gnfSwKKwl7TlVMTCwgMCwgTlVMTCwgMH0sCit9OworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGM7CisJc25kX3NlcV90ICpzZXE7CisJaW50IHF1ZXVlID0gMCwgY29udmVydF90aW1lID0gMCwgY29udmVydF9yZWFsID0gMCwgZXhjbHVzaXZlID0gMDsKKwlpbnQgY29tbWFuZCA9IFNVQlNDUklCRTsKKwlpbnQgbGlzdF9wZXJtID0gMDsKKwlpbnQgY2xpZW50OworCWludCBsaXN0X3N1YnMgPSAwOworCXNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfdCAqc3ViczsKKwlzbmRfc2VxX2FkZHJfdCBzZW5kZXIsIGRlc3Q7CisKKyNpZmRlZiBFTkFCTEVfTkxTCisJc2V0bG9jYWxlKExDX0FMTCwgIiIpOworCXRleHRkb21haW4oUEFDS0FHRSk7CisjZW5kaWYKKworCXdoaWxlICgoYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJkaW9yOnQ6ZWx4IiwgbG9uZ19vcHRpb24sIE5VTEwpKSAhPSAtMSkgeworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnZCc6CisJCQljb21tYW5kID0gVU5TVUJTQ1JJQkU7CisJCQlicmVhazsKKwkJY2FzZSAnaSc6CisJCQljb21tYW5kID0gTElTVDsKKwkJCWxpc3RfcGVybSB8PSBMSVNUX0lOUFVUOworCQkJYnJlYWs7CisJCWNhc2UgJ28nOgorCQkJY29tbWFuZCA9IExJU1Q7CisJCQlsaXN0X3Blcm0gfD0gTElTVF9PVVRQVVQ7CisJCQlicmVhazsKKwkJY2FzZSAnZSc6CisJCQlleGNsdXNpdmUgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJcXVldWUgPSBhdG9pKG9wdGFyZyk7CisJCQljb252ZXJ0X3RpbWUgPSAxOworCQkJY29udmVydF9yZWFsID0gMTsKKwkJCWJyZWFrOworCQljYXNlICd0JzoKKwkJCXF1ZXVlID0gYXRvaShvcHRhcmcpOworCQkJY29udmVydF90aW1lID0gMTsKKwkJCWNvbnZlcnRfcmVhbCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQlsaXN0X3N1YnMgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3gnOgorCQkJY29tbWFuZCA9IFJFTU9WRV9BTEw7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKCk7CisJCQlleGl0KDEpOworCQl9CisJfQorCisJaWYgKHNuZF9zZXFfb3Blbigmc2VxLCAiZGVmYXVsdCIsIFNORF9TRVFfT1BFTl9EVVBMRVgsIDApIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgXygiY2FuJ3Qgb3BlbiBzZXF1ZW5jZXJcbiIpKTsKKwkJcmV0dXJuIDE7CisJfQorCQorCXNuZF9saWJfZXJyb3Jfc2V0X2hhbmRsZXIoZXJyb3JfaGFuZGxlcik7CisKKwlzd2l0Y2ggKGNvbW1hbmQpIHsKKwljYXNlIExJU1Q6CisJCWRvX3NlYXJjaF9wb3J0KHNlcSwgbGlzdF9wZXJtLAorCQkJICAgICAgIGxpc3Rfc3VicyA/IHByaW50X3BvcnRfYW5kX3N1YnMgOiBwcmludF9wb3J0KTsKKwkJc25kX3NlcV9jbG9zZShzZXEpOworCQlyZXR1cm4gMDsKKwljYXNlIFJFTU9WRV9BTEw6CisJCXJlbW92ZV9hbGxfY29ubmVjdGlvbnMoc2VxKTsKKwkJc25kX3NlcV9jbG9zZShzZXEpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBjb25uZWN0aW9uIG9yIGRpc2Nvbm5lY3Rpb24gKi8KKworCWlmIChvcHRpbmQgKyAyID4gYXJnYykgeworCQlzbmRfc2VxX2Nsb3NlKHNlcSk7CisJCXVzYWdlKCk7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKChjbGllbnQgPSBzbmRfc2VxX2NsaWVudF9pZChzZXEpKSA8IDApIHsKKwkJc25kX3NlcV9jbG9zZShzZXEpOworCQlmcHJpbnRmKHN0ZGVyciwgXygiY2FuJ3QgZ2V0IGNsaWVudCBpZFxuIikpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBzZXQgY2xpZW50IGluZm8gKi8KKwlpZiAoc25kX3NlcV9zZXRfY2xpZW50X25hbWUoc2VxLCAiQUxTQSBDb25uZWN0b3IiKSA8IDApIHsKKwkJc25kX3NlcV9jbG9zZShzZXEpOworCQlmcHJpbnRmKHN0ZGVyciwgXygiY2FuJ3Qgc2V0IGNsaWVudCBpbmZvXG4iKSk7CisJCXJldHVybiAxOworCX0KKworCS8qIHNldCBzdWJzY3JpcHRpb24gKi8KKwlpZiAoc25kX3NlcV9wYXJzZV9hZGRyZXNzKHNlcSwgJnNlbmRlciwgYXJndltvcHRpbmRdKSA8IDApIHsKKwkJc25kX3NlcV9jbG9zZShzZXEpOworCQlmcHJpbnRmKHN0ZGVyciwgXygiaW52YWxpZCBzZW5kZXIgYWRkcmVzcyAlc1xuIiksIGFyZ3Zbb3B0aW5kXSk7CisJCXJldHVybiAxOworCX0KKwlpZiAoc25kX3NlcV9wYXJzZV9hZGRyZXNzKHNlcSwgJmRlc3QsIGFyZ3Zbb3B0aW5kICsgMV0pIDwgMCkgeworCQlzbmRfc2VxX2Nsb3NlKHNlcSk7CisJCWZwcmludGYoc3RkZXJyLCBfKCJpbnZhbGlkIGRlc3RpbmF0aW9uIGFkZHJlc3MgJXNcbiIpLCBhcmd2W29wdGluZCArIDFdKTsKKwkJcmV0dXJuIDE7CisJfQorCXNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfYWxsb2NhKCZzdWJzKTsKKwlzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3NldF9zZW5kZXIoc3VicywgJnNlbmRlcik7CisJc25kX3NlcV9wb3J0X3N1YnNjcmliZV9zZXRfZGVzdChzdWJzLCAmZGVzdCk7CisJc25kX3NlcV9wb3J0X3N1YnNjcmliZV9zZXRfcXVldWUoc3VicywgcXVldWUpOworCXNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfc2V0X2V4Y2x1c2l2ZShzdWJzLCBleGNsdXNpdmUpOworCXNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfc2V0X3RpbWVfdXBkYXRlKHN1YnMsIGNvbnZlcnRfdGltZSk7CisJc25kX3NlcV9wb3J0X3N1YnNjcmliZV9zZXRfdGltZV9yZWFsKHN1YnMsIGNvbnZlcnRfcmVhbCk7CisKKwlpZiAoY29tbWFuZCA9PSBVTlNVQlNDUklCRSkgeworCQlpZiAoc25kX3NlcV9nZXRfcG9ydF9zdWJzY3JpcHRpb24oc2VxLCBzdWJzKSA8IDApIHsKKwkJCXNuZF9zZXFfY2xvc2Uoc2VxKTsKKwkJCWZwcmludGYoc3RkZXJyLCBfKCJObyBzdWJzY3JpcHRpb24gaXMgZm91bmRcbiIpKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmIChzbmRfc2VxX3Vuc3Vic2NyaWJlX3BvcnQoc2VxLCBzdWJzKSA8IDApIHsKKwkJCXNuZF9zZXFfY2xvc2Uoc2VxKTsKKwkJCWZwcmludGYoc3RkZXJyLCBfKCJEaXNjb25uZWN0aW9uIGZhaWxlZCAoJXMpXG4iKSwgc25kX3N0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChzbmRfc2VxX2dldF9wb3J0X3N1YnNjcmlwdGlvbihzZXEsIHN1YnMpID09IDApIHsKKwkJCXNuZF9zZXFfY2xvc2Uoc2VxKTsKKwkJCWZwcmludGYoc3RkZXJyLCBfKCJDb25uZWN0aW9uIGlzIGFscmVhZHkgc3Vic2NyaWJlZFxuIikpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKHNuZF9zZXFfc3Vic2NyaWJlX3BvcnQoc2VxLCBzdWJzKSA8IDApIHsKKwkJCXNuZF9zZXFfY2xvc2Uoc2VxKTsKKwkJCWZwcmludGYoc3RkZXJyLCBfKCJDb25uZWN0aW9uIGZhaWxlZCAoJXMpXG4iKSwgc25kX3N0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCXNuZF9zZXFfY2xvc2Uoc2VxKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2VxL2FwbGF5bWlkaS9NYWtlZmlsZS5hbSBiL3NlcS9hcGxheW1pZGkvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVkMmEwZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcS9hcGxheW1pZGkvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw1IEBACitJTkNMVURFUyA9IC1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlCitFWFRSQV9ESVNUID0gYXBsYXltaWRpLjEgYXJlY29yZG1pZGkuMQorCitiaW5fUFJPR1JBTVMgPSBhcGxheW1pZGkgYXJlY29yZG1pZGkKK21hbl9NQU5TID0gYXBsYXltaWRpLjEgYXJlY29yZG1pZGkuMQpkaWZmIC0tZ2l0IGEvc2VxL2FwbGF5bWlkaS9hcGxheW1pZGkuMSBiL3NlcS9hcGxheW1pZGkvYXBsYXltaWRpLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJmZWY5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcS9hcGxheW1pZGkvYXBsYXltaWRpLjEKQEAgLTAsMCArMSw2MyBAQAorLlRIIEFQTEFZTUlESSAxICIyIE5vdiAyMDExIgorCisuU0ggTkFNRQorYXBsYXltaWRpIFwtIHBsYXkgU3RhbmRhcmQgTUlESSBGaWxlcworCisuU0ggU1lOT1BTSVMKKy5CIGFwbGF5bWlkaQorXC1wIGNsaWVudDpwb3J0WywuLi5dIFtcLWQgZGVsYXldIG1pZGlmaWxlIC4uLgorCisuU0ggREVTQ1JJUFRJT04KKy5CIGFwbGF5bWlkaQoraXMgYSBjb21tYW5kLWxpbmUgdXRpbGl0eSB0aGF0IHBsYXlzIHRoZSBzcGVjaWZpZWQgTUlESSBmaWxlKHMpIHRvIG9uZQorb3IgbW9yZSBBTFNBIHNlcXVlbmNlciBwb3J0cy4KKworLlNIIE9QVElPTlMKKworLlRQCisuSSBcLWgsIFwtXC1oZWxwCitQcmludHMgYSBsaXN0IG9mIG9wdGlvbnMuCisKKy5UUAorLkkgXC1WLCBcLVwtdmVyc2lvbgorUHJpbnRzIHRoZSBjdXJyZW50IHZlcnNpb24uCisKKy5UUAorLkkgXC1sLCBcLVwtbGlzdAorUHJpbnRzIGEgbGlzdCBvZiBwb3NzaWJsZSBvdXRwdXQgcG9ydHMuCisKKy5UUAorLkkgXC1wLCBcLVwtcG9ydD1jbGllbnQ6cG9ydCwuLi4KK1NldHMgdGhlIHNlcXVlbmNlciBwb3J0KHMpIHRvIHdoaWNoIHRoZSBldmVudHMgaW4gdGhlIE1JREkgZmlsZShzKSBhcmUKK3NlbnQuCisKK0EgY2xpZW50IGNhbiBiZSBzcGVjaWZpZWQgYnkgaXRzIG51bWJlciwgaXRzIG5hbWUsIG9yIGEgcHJlZml4IG9mIGl0cworbmFtZS4gQSBwb3J0IGlzIHNwZWNpZmllZCBieSBpdHMgbnVtYmVyOyBmb3IgcG9ydCAwIG9mIGEgY2xpZW50LCB0aGUKKyI6MCIgcGFydCBvZiB0aGUgcG9ydCBzcGVjaWZpY2F0aW9uIGNhbiBiZSBvbWl0dGVkLgorCitNdWx0aXBsZSBwb3J0cyBjYW4gYmUgc3BlY2lmaWVkIHRvIGFsbG93IHBsYXliYWNrIG9mIE1JREkgZmlsZShzKSB0aGF0Citjb250YWluIGV2ZW50cyBmb3IgbXVsdGlwbGUgZGV2aWNlcyAocG9ydHMpLCBhcyBzcGVjaWZpZWQgYnkgIlBvcnQKK051bWJlciIgbWV0YSBldmVudHMuCisKK0ZvciBjb21wYXRpYmlsaXR5IHdpdGgKKy5CIHBtaWRpKDEpLAordGhlIHBvcnQgc3BlY2lmaWNhdGlvbiBpcyB0YWtlbiBmcm9tIHRoZQorLkkgQUxTQV9PVVRQVVRfUE9SVFMKK2Vudmlyb25tZW50IHZhcmlhYmxlIGlmIG5vbmUgaXMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4KKworLlRQCisuSSBcLWQsIFwtXC1kZWxheT1zZWNvbmRzCitTcGVjaWZpZXMgaG93IGxvbmcgdG8gd2FpdCBhZnRlciB0aGUgZW5kIG9mIGVhY2ggTUlESSBmaWxlLAordG8gYWxsb3cgdGhlIGxhc3Qgbm90ZXMgdG8gZGllIGF3YXkuCisKKy5TSCBCVUdTCisuQiBhcGxheW1pZGkKK2hhbmRsZXMgIlBvcnQgTnVtYmVyIiBtZXRhIGV2ZW50cywgYnV0IG5vdCAiUG9ydCBOYW1lIiBtZXRhIGV2ZW50cy4KKworLlNIIFNFRSBBTFNPCitwbWlkaSgxKQorLmJyCitwbGF5bWlkaSgxKQorCisuU0ggQVVUSE9SCitDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4KZGlmZiAtLWdpdCBhL3NlcS9hcGxheW1pZGkvYXBsYXltaWRpLmMgYi9zZXEvYXBsYXltaWRpL2FwbGF5bWlkaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNTA4YjMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXEvYXBsYXltaWRpL2FwbGF5bWlkaS5jCkBAIC0wLDAgKzEsOTMyIEBACisvKgorICogYXBsYXltaWRpLmMgLSBwbGF5IFN0YW5kYXJkIE1JREkgRmlsZXMgdG8gc2VxdWVuY2VyIHBvcnQocykKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4KKyAqCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKiBUT0RPOiBzZXF1ZW5jZXIgcXVldWUgdGltZXIgc2VsZWN0aW9uICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGFsc2EvYXNvdW5kbGliLmg+CisjaW5jbHVkZSAiYWNvbmZpZy5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKworLyoKKyAqIDMxLjI1IGtiYXVkLCBvbmUgc3RhcnQgYml0LCBlaWdodCBkYXRhIGJpdHMsIHR3byBzdG9wIGJpdHMuCisgKiAoVGhlIE1JREkgc3BlYyBzYXlzIG9uZSBzdG9wIGJpdCwgYnV0IGV2ZXJ5IHRyYW5zbWl0dGVyIHVzZXMgdHdvLCBqdXN0IHRvIGJlCisgKiBzdXJlLCBzbyB3ZSBiZXR0ZXIgbm90IGV4Y2VlZCB0aGF0IHRvIGF2b2lkIG92ZXJmbG93aW5nIHRoZSBvdXRwdXQgYnVmZmVyLikKKyAqLworI2RlZmluZSBNSURJX0JZVEVTX1BFUl9TRUMgKDMxMjUwIC8gKDEgKyA4ICsgMikpCisKKy8qCisgKiBBIE1JREkgZXZlbnQgYWZ0ZXIgYmVpbmcgcGFyc2VkL2xvYWRlZCBmcm9tIHRoZSBmaWxlLgorICogVGhlcmUgY291bGQgYmUgbWFkZSBhIGNhc2UgZm9yIHVzaW5nIHNuZF9zZXFfZXZlbnRfdCBpbnN0ZWFkLgorICovCitzdHJ1Y3QgZXZlbnQgeworCXN0cnVjdCBldmVudCAqbmV4dDsJCS8qIGxpbmtlZCBsaXN0ICovCisKKwl1bnNpZ25lZCBjaGFyIHR5cGU7CQkvKiBTTkRfU0VRX0VWRU5UX3h4eCAqLworCXVuc2lnbmVkIGNoYXIgcG9ydDsJCS8qIHBvcnQgaW5kZXggKi8KKwl1bnNpZ25lZCBpbnQgdGljazsKKwl1bmlvbiB7CisJCXVuc2lnbmVkIGNoYXIgZFszXTsJLyogY2hhbm5lbCBhbmQgZGF0YSBieXRlcyAqLworCQlpbnQgdGVtcG87CisJCXVuc2lnbmVkIGludCBsZW5ndGg7CS8qIGxlbmd0aCBvZiBzeXNleCBkYXRhICovCisJfSBkYXRhOworCXVuc2lnbmVkIGNoYXIgc3lzZXhbMF07Cit9OworCitzdHJ1Y3QgdHJhY2sgeworCXN0cnVjdCBldmVudCAqZmlyc3RfZXZlbnQ7CS8qIGxpc3Qgb2YgYWxsIGV2ZW50cyBpbiB0aGlzIHRyYWNrICovCisJaW50IGVuZF90aWNrOwkJCS8qIGxlbmd0aCBvZiB0aGlzIHRyYWNrICovCisKKwlzdHJ1Y3QgZXZlbnQgKmN1cnJlbnRfZXZlbnQ7CS8qIHVzZWQgd2hpbGUgbG9hZGluZyBhbmQgcGxheWluZyAqLworfTsKKworc3RhdGljIHNuZF9zZXFfdCAqc2VxOworc3RhdGljIGludCBjbGllbnQ7CitzdGF0aWMgaW50IHBvcnRfY291bnQ7CitzdGF0aWMgc25kX3NlcV9hZGRyX3QgKnBvcnRzOworc3RhdGljIGludCBxdWV1ZTsKK3N0YXRpYyBpbnQgZW5kX2RlbGF5ID0gMjsKK3N0YXRpYyBjb25zdCBjaGFyICpmaWxlX25hbWU7CitzdGF0aWMgRklMRSAqZmlsZTsKK3N0YXRpYyBpbnQgZmlsZV9vZmZzZXQ7CQkvKiBjdXJyZW50IG9mZnNldCBpbiBpbnB1dCBmaWxlICovCitzdGF0aWMgaW50IG51bV90cmFja3M7CitzdGF0aWMgc3RydWN0IHRyYWNrICp0cmFja3M7CitzdGF0aWMgaW50IHNtcHRlX3RpbWluZzsKKworLyogcHJpbnRzIGFuIGVycm9yIG1lc3NhZ2UgdG8gc3RkZXJyICovCitzdGF0aWMgdm9pZCBlcnJvcm1zZyhjb25zdCBjaGFyICptc2csIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJdmFfc3RhcnQoYXAsIG1zZyk7CisJdmZwcmludGYoc3RkZXJyLCBtc2csIGFwKTsKKwl2YV9lbmQoYXApOworCWZwdXRjKCdcbicsIHN0ZGVycik7Cit9CisKKy8qIHByaW50cyBhbiBlcnJvciBtZXNzYWdlIHRvIHN0ZGVyciwgYW5kIGRpZXMgKi8KK3N0YXRpYyB2b2lkIGZhdGFsKGNvbnN0IGNoYXIgKm1zZywgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgbXNnKTsKKwl2ZnByaW50ZihzdGRlcnIsIG1zZywgYXApOworCXZhX2VuZChhcCk7CisJZnB1dGMoJ1xuJywgc3RkZXJyKTsKKwlleGl0KEVYSVRfRkFJTFVSRSk7Cit9CisKKy8qIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yIGhhbmRsaW5nICovCitzdGF0aWMgdm9pZCBjaGVja19tZW0odm9pZCAqcCkKK3sKKwlpZiAoIXApCisJCWZhdGFsKCJPdXQgb2YgbWVtb3J5Iik7Cit9CisKKy8qIGVycm9yIGhhbmRsaW5nIGZvciBBTFNBIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgY2hlY2tfc25kKGNvbnN0IGNoYXIgKm9wZXJhdGlvbiwgaW50IGVycikKK3sKKwlpZiAoZXJyIDwgMCkKKwkJZmF0YWwoIkNhbm5vdCAlcyAtICVzIiwgb3BlcmF0aW9uLCBzbmRfc3RyZXJyb3IoZXJyKSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfc2VxKHZvaWQpCit7CisJaW50IGVycjsKKworCS8qIG9wZW4gc2VxdWVuY2VyICovCisJZXJyID0gc25kX3NlcV9vcGVuKCZzZXEsICJkZWZhdWx0IiwgU05EX1NFUV9PUEVOX0RVUExFWCwgMCk7CisJY2hlY2tfc25kKCJvcGVuIHNlcXVlbmNlciIsIGVycik7CisKKwkvKiBzZXQgb3VyIG5hbWUgKG90aGVyd2lzZSBpdCdzICJDbGllbnQteHh4IikgKi8KKwllcnIgPSBzbmRfc2VxX3NldF9jbGllbnRfbmFtZShzZXEsICJhcGxheW1pZGkiKTsKKwljaGVja19zbmQoInNldCBjbGllbnQgbmFtZSIsIGVycik7CisKKwkvKiBmaW5kIG91dCB3aG8gd2UgYWN0dWFsbHkgYXJlICovCisJY2xpZW50ID0gc25kX3NlcV9jbGllbnRfaWQoc2VxKTsKKwljaGVja19zbmQoImdldCBjbGllbnQgaWQiLCBjbGllbnQpOworfQorCisvKiBwYXJzZXMgb25lIG9yIG1vcmUgcG9ydCBhZGRyZXNzZXMgZnJvbSB0aGUgc3RyaW5nICovCitzdGF0aWMgdm9pZCBwYXJzZV9wb3J0cyhjb25zdCBjaGFyICphcmcpCit7CisJY2hhciAqYnVmLCAqcywgKnBvcnRfbmFtZTsKKwlpbnQgZXJyOworCisJLyogbWFrZSBhIGNvcHkgb2YgdGhlIHN0cmluZyBiZWNhdXNlIHdlJ3JlIGdvaW5nIHRvIG1vZGlmeSBpdCAqLworCWJ1ZiA9IHN0cmR1cChhcmcpOworCWNoZWNrX21lbShidWYpOworCisJZm9yIChwb3J0X25hbWUgPSBzID0gYnVmOyBzOyBwb3J0X25hbWUgPSBzICsgMSkgeworCQkvKiBBc3N1bWUgdGhhdCBwb3J0cyBhcmUgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIFdlIGRvbid0IHVzZQorCQkgKiBzcGFjZXMgYmVjYXVzZSB0aG9zZSBhcmUgdmFsaWQgaW4gY2xpZW50IG5hbWVzLiAqLworCQlzID0gc3RyY2hyKHBvcnRfbmFtZSwgJywnKTsKKwkJaWYgKHMpCisJCQkqcyA9ICdcMCc7CisKKwkJKytwb3J0X2NvdW50OworCQlwb3J0cyA9IHJlYWxsb2MocG9ydHMsIHBvcnRfY291bnQgKiBzaXplb2Yoc25kX3NlcV9hZGRyX3QpKTsKKwkJY2hlY2tfbWVtKHBvcnRzKTsKKworCQllcnIgPSBzbmRfc2VxX3BhcnNlX2FkZHJlc3Moc2VxLCAmcG9ydHNbcG9ydF9jb3VudCAtIDFdLCBwb3J0X25hbWUpOworCQlpZiAoZXJyIDwgMCkKKwkJCWZhdGFsKCJJbnZhbGlkIHBvcnQgJXMgLSAlcyIsIHBvcnRfbmFtZSwgc25kX3N0cmVycm9yKGVycikpOworCX0KKworCWZyZWUoYnVmKTsKK30KKworc3RhdGljIHZvaWQgY3JlYXRlX3NvdXJjZV9wb3J0KHZvaWQpCit7CisJc25kX3NlcV9wb3J0X2luZm9fdCAqcGluZm87CisJaW50IGVycjsKKworCXNuZF9zZXFfcG9ydF9pbmZvX2FsbG9jYSgmcGluZm8pOworCisJLyogdGhlIGZpcnN0IGNyZWF0ZWQgcG9ydCBpcyAwIGFueXdheSwgYnV0IGxldCdzIG1ha2Ugc3VyZSAuLi4gKi8KKwlzbmRfc2VxX3BvcnRfaW5mb19zZXRfcG9ydChwaW5mbywgMCk7CisJc25kX3NlcV9wb3J0X2luZm9fc2V0X3BvcnRfc3BlY2lmaWVkKHBpbmZvLCAxKTsKKworCXNuZF9zZXFfcG9ydF9pbmZvX3NldF9uYW1lKHBpbmZvLCAiYXBsYXltaWRpIik7CisKKwlzbmRfc2VxX3BvcnRfaW5mb19zZXRfY2FwYWJpbGl0eShwaW5mbywgMCk7IC8qIHNpYyAqLworCXNuZF9zZXFfcG9ydF9pbmZvX3NldF90eXBlKHBpbmZvLAorCQkJCSAgIFNORF9TRVFfUE9SVF9UWVBFX01JRElfR0VORVJJQyB8CisJCQkJICAgU05EX1NFUV9QT1JUX1RZUEVfQVBQTElDQVRJT04pOworCisJZXJyID0gc25kX3NlcV9jcmVhdGVfcG9ydChzZXEsIHBpbmZvKTsKKwljaGVja19zbmQoImNyZWF0ZSBwb3J0IiwgZXJyKTsKK30KKworc3RhdGljIHZvaWQgY3JlYXRlX3F1ZXVlKHZvaWQpCit7CisJcXVldWUgPSBzbmRfc2VxX2FsbG9jX25hbWVkX3F1ZXVlKHNlcSwgImFwbGF5bWlkaSIpOworCWNoZWNrX3NuZCgiY3JlYXRlIHF1ZXVlIiwgcXVldWUpOworCS8qIHRoZSBxdWV1ZSBpcyBub3cgbG9ja2VkLCB3aGljaCBpcyBqdXN0IGZpbmUgKi8KK30KKworc3RhdGljIHZvaWQgY29ubmVjdF9wb3J0cyh2b2lkKQoreworCWludCBpLCBlcnI7CisKKwkvKgorCSAqIFdlIHNlbmQgTUlESSBldmVudHMgd2l0aCBleHBsaWNpdCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMsIHNvIHdlIGRvbid0CisJICogbmVlZCBhbnkgY29ubmVjdGlvbnMgdG8gdGhlIHBsYXliYWNrIHBvcnRzLiAgQnV0IHdlIGNvbm5lY3QgdG8gdGhvc2UKKwkgKiBhbnl3YXkgdG8gZm9yY2UgYW55IHVuZGVybHlpbmcgUmF3TUlESSBwb3J0cyB0byByZW1haW4gb3BlbiB3aGlsZQorCSAqIHdlJ3JlIHBsYXlpbmcgLSBvdGhlcndpc2UsIEFMU0Egd291bGQgcmVzZXQgdGhlIHBvcnQgYWZ0ZXIgZXZlcnkKKwkgKiBldmVudC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcG9ydF9jb3VudDsgKytpKSB7CisJCWVyciA9IHNuZF9zZXFfY29ubmVjdF90byhzZXEsIDAsIHBvcnRzW2ldLmNsaWVudCwgcG9ydHNbaV0ucG9ydCk7CisJCWlmIChlcnIgPCAwKQorCQkJZmF0YWwoIkNhbm5vdCBjb25uZWN0IHRvIHBvcnQgJWQ6JWQgLSAlcyIsCisJCQkgICAgICBwb3J0c1tpXS5jbGllbnQsIHBvcnRzW2ldLnBvcnQsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9ieXRlKHZvaWQpCit7CisJKytmaWxlX29mZnNldDsKKwlyZXR1cm4gZ2V0YyhmaWxlKTsKK30KKworLyogcmVhZHMgYSBsaXR0bGUtZW5kaWFuIDMyLWJpdCBpbnRlZ2VyICovCitzdGF0aWMgaW50IHJlYWRfMzJfbGUodm9pZCkKK3sKKwlpbnQgdmFsdWU7CisJdmFsdWUgPSByZWFkX2J5dGUoKTsKKwl2YWx1ZSB8PSByZWFkX2J5dGUoKSA8PCA4OworCXZhbHVlIHw9IHJlYWRfYnl0ZSgpIDw8IDE2OworCXZhbHVlIHw9IHJlYWRfYnl0ZSgpIDw8IDI0OworCXJldHVybiAhZmVvZihmaWxlKSA/IHZhbHVlIDogLTE7Cit9CisKKy8qIHJlYWRzIGEgNC1jaGFyYWN0ZXIgaWRlbnRpZmllciAqLworc3RhdGljIGludCByZWFkX2lkKHZvaWQpCit7CisJcmV0dXJuIHJlYWRfMzJfbGUoKTsKK30KKyNkZWZpbmUgTUFLRV9JRChjMSwgYzIsIGMzLCBjNCkgKChjMSkgfCAoKGMyKSA8PCA4KSB8ICgoYzMpIDw8IDE2KSB8ICgoYzQpIDw8IDI0KSkKKworLyogcmVhZHMgYSBmaXhlZC1zaXplIGJpZy1lbmRpYW4gbnVtYmVyICovCitzdGF0aWMgaW50IHJlYWRfaW50KGludCBieXRlcykKK3sKKwlpbnQgYywgdmFsdWUgPSAwOworCisJZG8geworCQljID0gcmVhZF9ieXRlKCk7CisJCWlmIChjID09IEVPRikKKwkJCXJldHVybiAtMTsKKwkJdmFsdWUgPSAodmFsdWUgPDwgOCkgfCBjOworCX0gd2hpbGUgKC0tYnl0ZXMpOworCXJldHVybiB2YWx1ZTsKK30KKworLyogcmVhZHMgYSB2YXJpYWJsZS1sZW5ndGggbnVtYmVyICovCitzdGF0aWMgaW50IHJlYWRfdmFyKHZvaWQpCit7CisJaW50IHZhbHVlLCBjOworCisJYyA9IHJlYWRfYnl0ZSgpOworCXZhbHVlID0gYyAmIDB4N2Y7CisJaWYgKGMgJiAweDgwKSB7CisJCWMgPSByZWFkX2J5dGUoKTsKKwkJdmFsdWUgPSAodmFsdWUgPDwgNykgfCAoYyAmIDB4N2YpOworCQlpZiAoYyAmIDB4ODApIHsKKwkJCWMgPSByZWFkX2J5dGUoKTsKKwkJCXZhbHVlID0gKHZhbHVlIDw8IDcpIHwgKGMgJiAweDdmKTsKKwkJCWlmIChjICYgMHg4MCkgeworCQkJCWMgPSByZWFkX2J5dGUoKTsKKwkJCQl2YWx1ZSA9ICh2YWx1ZSA8PCA3KSB8IGM7CisJCQkJaWYgKGMgJiAweDgwKQorCQkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuICFmZW9mKGZpbGUpID8gdmFsdWUgOiAtMTsKK30KKworLyogYWxsb2NhdGVzIGEgbmV3IGV2ZW50ICovCitzdGF0aWMgc3RydWN0IGV2ZW50ICpuZXdfZXZlbnQoc3RydWN0IHRyYWNrICp0cmFjaywgaW50IHN5c2V4X2xlbmd0aCkKK3sKKwlzdHJ1Y3QgZXZlbnQgKmV2ZW50OworCisJZXZlbnQgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBldmVudCkgKyBzeXNleF9sZW5ndGgpOworCWNoZWNrX21lbShldmVudCk7CisKKwlldmVudC0+bmV4dCA9IE5VTEw7CisKKwkvKiBhcHBlbmQgYXQgdGhlIGVuZCBvZiB0aGUgdHJhY2sncyBsaW5rZWQgbGlzdCAqLworCWlmICh0cmFjay0+Y3VycmVudF9ldmVudCkKKwkJdHJhY2stPmN1cnJlbnRfZXZlbnQtPm5leHQgPSBldmVudDsKKwllbHNlCisJCXRyYWNrLT5maXJzdF9ldmVudCA9IGV2ZW50OworCXRyYWNrLT5jdXJyZW50X2V2ZW50ID0gZXZlbnQ7CisKKwlyZXR1cm4gZXZlbnQ7Cit9CisKK3N0YXRpYyB2b2lkIHNraXAoaW50IGJ5dGVzKQoreworCXdoaWxlIChieXRlcyA+IDApCisJCXJlYWRfYnl0ZSgpLCAtLWJ5dGVzOworfQorCisvKiByZWFkcyBvbmUgY29tcGxldGUgdHJhY2sgZnJvbSB0aGUgZmlsZSAqLworc3RhdGljIGludCByZWFkX3RyYWNrKHN0cnVjdCB0cmFjayAqdHJhY2ssIGludCB0cmFja19lbmQpCit7CisJaW50IHRpY2sgPSAwOworCXVuc2lnbmVkIGNoYXIgbGFzdF9jbWQgPSAwOworCXVuc2lnbmVkIGNoYXIgcG9ydCA9IDA7CisKKwkvKiB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uIGlzIGFmdGVyIHRoZSB0cmFjayBJRCBhbmQgbGVuZ3RoICovCisJd2hpbGUgKGZpbGVfb2Zmc2V0IDwgdHJhY2tfZW5kKSB7CisJCXVuc2lnbmVkIGNoYXIgY21kOworCQlzdHJ1Y3QgZXZlbnQgKmV2ZW50OworCQlpbnQgZGVsdGFfdGlja3MsIGxlbiwgYzsKKworCQlkZWx0YV90aWNrcyA9IHJlYWRfdmFyKCk7CisJCWlmIChkZWx0YV90aWNrcyA8IDApCisJCQlicmVhazsKKwkJdGljayArPSBkZWx0YV90aWNrczsKKworCQljID0gcmVhZF9ieXRlKCk7CisJCWlmIChjIDwgMCkKKwkJCWJyZWFrOworCisJCWlmIChjICYgMHg4MCkgeworCQkJLyogaGF2ZSBjb21tYW5kICovCisJCQljbWQgPSBjOworCQkJaWYgKGNtZCA8IDB4ZjApCisJCQkJbGFzdF9jbWQgPSBjbWQ7CisJCX0gZWxzZSB7CisJCQkvKiBydW5uaW5nIHN0YXR1cyAqLworCQkJdW5nZXRjKGMsIGZpbGUpOworCQkJZmlsZV9vZmZzZXQtLTsKKwkJCWNtZCA9IGxhc3RfY21kOworCQkJaWYgKCFjbWQpCisJCQkJZ290byBfZXJyb3I7CisJCX0KKworCQlzd2l0Y2ggKGNtZCA+PiA0KSB7CisJCQkvKiBtYXBzIFNNRiBldmVudHMgdG8gQUxTQSBzZXF1ZW5jZXIgZXZlbnRzICovCisJCQlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBjbWRfdHlwZVtdID0geworCQkJCVsweDhdID0gU05EX1NFUV9FVkVOVF9OT1RFT0ZGLAorCQkJCVsweDldID0gU05EX1NFUV9FVkVOVF9OT1RFT04sCisJCQkJWzB4YV0gPSBTTkRfU0VRX0VWRU5UX0tFWVBSRVNTLAorCQkJCVsweGJdID0gU05EX1NFUV9FVkVOVF9DT05UUk9MTEVSLAorCQkJCVsweGNdID0gU05EX1NFUV9FVkVOVF9QR01DSEFOR0UsCisJCQkJWzB4ZF0gPSBTTkRfU0VRX0VWRU5UX0NIQU5QUkVTUywKKwkJCQlbMHhlXSA9IFNORF9TRVFfRVZFTlRfUElUQ0hCRU5ECisJCQl9OworCisJCWNhc2UgMHg4OiAvKiBjaGFubmVsIG1zZyB3aXRoIDIgcGFyYW1ldGVyIGJ5dGVzICovCisJCWNhc2UgMHg5OgorCQljYXNlIDB4YToKKwkJY2FzZSAweGI6CisJCWNhc2UgMHhlOgorCQkJZXZlbnQgPSBuZXdfZXZlbnQodHJhY2ssIDApOworCQkJZXZlbnQtPnR5cGUgPSBjbWRfdHlwZVtjbWQgPj4gNF07CisJCQlldmVudC0+cG9ydCA9IHBvcnQ7CisJCQlldmVudC0+dGljayA9IHRpY2s7CisJCQlldmVudC0+ZGF0YS5kWzBdID0gY21kICYgMHgwZjsKKwkJCWV2ZW50LT5kYXRhLmRbMV0gPSByZWFkX2J5dGUoKSAmIDB4N2Y7CisJCQlldmVudC0+ZGF0YS5kWzJdID0gcmVhZF9ieXRlKCkgJiAweDdmOworCQkJYnJlYWs7CisKKwkJY2FzZSAweGM6IC8qIGNoYW5uZWwgbXNnIHdpdGggMSBwYXJhbWV0ZXIgYnl0ZSAqLworCQljYXNlIDB4ZDoKKwkJCWV2ZW50ID0gbmV3X2V2ZW50KHRyYWNrLCAwKTsKKwkJCWV2ZW50LT50eXBlID0gY21kX3R5cGVbY21kID4+IDRdOworCQkJZXZlbnQtPnBvcnQgPSBwb3J0OworCQkJZXZlbnQtPnRpY2sgPSB0aWNrOworCQkJZXZlbnQtPmRhdGEuZFswXSA9IGNtZCAmIDB4MGY7CisJCQlldmVudC0+ZGF0YS5kWzFdID0gcmVhZF9ieXRlKCkgJiAweDdmOworCQkJYnJlYWs7CisKKwkJY2FzZSAweGY6CisJCQlzd2l0Y2ggKGNtZCkgeworCQkJY2FzZSAweGYwOiAvKiBzeXNleCAqLworCQkJY2FzZSAweGY3OiAvKiBjb250aW51ZWQgc3lzZXgsIG9yIGVzY2FwZWQgY29tbWFuZHMgKi8KKwkJCQlsZW4gPSByZWFkX3ZhcigpOworCQkJCWlmIChsZW4gPCAwKQorCQkJCQlnb3RvIF9lcnJvcjsKKwkJCQlpZiAoY21kID09IDB4ZjApCisJCQkJCSsrbGVuOworCQkJCWV2ZW50ID0gbmV3X2V2ZW50KHRyYWNrLCBsZW4pOworCQkJCWV2ZW50LT50eXBlID0gU05EX1NFUV9FVkVOVF9TWVNFWDsKKwkJCQlldmVudC0+cG9ydCA9IHBvcnQ7CisJCQkJZXZlbnQtPnRpY2sgPSB0aWNrOworCQkJCWV2ZW50LT5kYXRhLmxlbmd0aCA9IGxlbjsKKwkJCQlpZiAoY21kID09IDB4ZjApIHsKKwkJCQkJZXZlbnQtPnN5c2V4WzBdID0gMHhmMDsKKwkJCQkJYyA9IDE7CisJCQkJfSBlbHNlIHsKKwkJCQkJYyA9IDA7CisJCQkJfQorCQkJCWZvciAoOyBjIDwgbGVuOyArK2MpCisJCQkJCWV2ZW50LT5zeXNleFtjXSA9IHJlYWRfYnl0ZSgpOworCQkJCWJyZWFrOworCisJCQljYXNlIDB4ZmY6IC8qIG1ldGEgZXZlbnQgKi8KKwkJCQljID0gcmVhZF9ieXRlKCk7CisJCQkJbGVuID0gcmVhZF92YXIoKTsKKwkJCQlpZiAobGVuIDwgMCkKKwkJCQkJZ290byBfZXJyb3I7CisKKwkJCQlzd2l0Y2ggKGMpIHsKKwkJCQljYXNlIDB4MjE6IC8qIHBvcnQgbnVtYmVyICovCisJCQkJCWlmIChsZW4gPCAxKQorCQkJCQkJZ290byBfZXJyb3I7CisJCQkJCXBvcnQgPSByZWFkX2J5dGUoKSAlIHBvcnRfY291bnQ7CisJCQkJCXNraXAobGVuIC0gMSk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAweDJmOiAvKiBlbmQgb2YgdHJhY2sgKi8KKwkJCQkJdHJhY2stPmVuZF90aWNrID0gdGljazsKKwkJCQkJc2tpcCh0cmFja19lbmQgLSBmaWxlX29mZnNldCk7CisJCQkJCXJldHVybiAxOworCisJCQkJY2FzZSAweDUxOiAvKiB0ZW1wbyAqLworCQkJCQlpZiAobGVuIDwgMykKKwkJCQkJCWdvdG8gX2Vycm9yOworCQkJCQlpZiAoc21wdGVfdGltaW5nKSB7CisJCQkJCQkvKiBTTVBURSB0aW1pbmcgZG9lc24ndCBjaGFuZ2UgKi8KKwkJCQkJCXNraXAobGVuKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWV2ZW50ID0gbmV3X2V2ZW50KHRyYWNrLCAwKTsKKwkJCQkJCWV2ZW50LT50eXBlID0gU05EX1NFUV9FVkVOVF9URU1QTzsKKwkJCQkJCWV2ZW50LT5wb3J0ID0gcG9ydDsKKwkJCQkJCWV2ZW50LT50aWNrID0gdGljazsKKwkJCQkJCWV2ZW50LT5kYXRhLnRlbXBvID0gcmVhZF9ieXRlKCkgPDwgMTY7CisJCQkJCQlldmVudC0+ZGF0YS50ZW1wbyB8PSByZWFkX2J5dGUoKSA8PCA4OworCQkJCQkJZXZlbnQtPmRhdGEudGVtcG8gfD0gcmVhZF9ieXRlKCk7CisJCQkJCQlza2lwKGxlbiAtIDMpOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDogLyogaWdub3JlIGFsbCBvdGhlciBtZXRhIGV2ZW50cyAqLworCQkJCQlza2lwKGxlbik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDogLyogaW52YWxpZCBGeCBjb21tYW5kICovCisJCQkJZ290byBfZXJyb3I7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OiAvKiBjYW5ub3QgaGFwcGVuICovCisJCQlnb3RvIF9lcnJvcjsKKwkJfQorCX0KK19lcnJvcjoKKwllcnJvcm1zZygiJXM6IGludmFsaWQgTUlESSBkYXRhIChvZmZzZXQgJSN4KSIsIGZpbGVfbmFtZSwgZmlsZV9vZmZzZXQpOworCXJldHVybiAwOworfQorCisvKiByZWFkcyBhbiBlbnRpcmUgTUlESSBmaWxlICovCitzdGF0aWMgaW50IHJlYWRfc21mKHZvaWQpCit7CisJaW50IGhlYWRlcl9sZW4sIHR5cGUsIHRpbWVfZGl2aXNpb24sIGksIGVycjsKKwlzbmRfc2VxX3F1ZXVlX3RlbXBvX3QgKnF1ZXVlX3RlbXBvOworCisJLyogdGhlIGN1cnJlbiBwb3NpdGlvbiBpcyBpbW1lZGlhdGVseSBhZnRlciB0aGUgIk1UaGQiIGlkICovCisJaGVhZGVyX2xlbiA9IHJlYWRfaW50KDQpOworCWlmIChoZWFkZXJfbGVuIDwgNikgeworaW52YWxpZF9mb3JtYXQ6CisJCWVycm9ybXNnKCIlczogaW52YWxpZCBmaWxlIGZvcm1hdCIsIGZpbGVfbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCXR5cGUgPSByZWFkX2ludCgyKTsKKwlpZiAodHlwZSAhPSAwICYmIHR5cGUgIT0gMSkgeworCQllcnJvcm1zZygiJXM6IHR5cGUgJWQgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQiLCBmaWxlX25hbWUsIHR5cGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwludW1fdHJhY2tzID0gcmVhZF9pbnQoMik7CisJaWYgKG51bV90cmFja3MgPCAxIHx8IG51bV90cmFja3MgPiAxMDAwKSB7CisJCWVycm9ybXNnKCIlczogaW52YWxpZCBudW1iZXIgb2YgdHJhY2tzICglZCkiLCBmaWxlX25hbWUsIG51bV90cmFja3MpOworCQludW1fdHJhY2tzID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCXRyYWNrcyA9IGNhbGxvYyhudW1fdHJhY2tzLCBzaXplb2Yoc3RydWN0IHRyYWNrKSk7CisJaWYgKCF0cmFja3MpIHsKKwkJZXJyb3Jtc2coIm91dCBvZiBtZW1vcnkiKTsKKwkJbnVtX3RyYWNrcyA9IDA7CisJCXJldHVybiAwOworCX0KKworCXRpbWVfZGl2aXNpb24gPSByZWFkX2ludCgyKTsKKwlpZiAodGltZV9kaXZpc2lvbiA8IDApCisJCWdvdG8gaW52YWxpZF9mb3JtYXQ7CisKKwkvKiBpbnRlcnByZXQgYW5kIHNldCB0ZW1wbyAqLworCXNuZF9zZXFfcXVldWVfdGVtcG9fYWxsb2NhKCZxdWV1ZV90ZW1wbyk7CisJc21wdGVfdGltaW5nID0gISEodGltZV9kaXZpc2lvbiAmIDB4ODAwMCk7CisJaWYgKCFzbXB0ZV90aW1pbmcpIHsKKwkJLyogdGltZV9kaXZpc2lvbiBpcyB0aWNrcyBwZXIgcXVhcnRlciAqLworCQlzbmRfc2VxX3F1ZXVlX3RlbXBvX3NldF90ZW1wbyhxdWV1ZV90ZW1wbywgNTAwMDAwKTsgLyogZGVmYXVsdDogMTIwIGJwbSAqLworCQlzbmRfc2VxX3F1ZXVlX3RlbXBvX3NldF9wcHEocXVldWVfdGVtcG8sIHRpbWVfZGl2aXNpb24pOworCX0gZWxzZSB7CisJCS8qIHVwcGVyIGJ5dGUgaXMgbmVnYXRpdmUgZnJhbWVzIHBlciBzZWNvbmQgKi8KKwkJaSA9IDB4ODAgLSAoKHRpbWVfZGl2aXNpb24gPj4gOCkgJiAweDdmKTsKKwkJLyogbG93ZXIgYnl0ZSBpcyB0aWNrcyBwZXIgZnJhbWUgKi8KKwkJdGltZV9kaXZpc2lvbiAmPSAweGZmOworCQkvKiBub3cgcHJldGVuZCB0aGF0IHdlIGhhdmUgcXVhcnRlci1ub3RlIGJhc2VkIHRpbWluZyAqLworCQlzd2l0Y2ggKGkpIHsKKwkJY2FzZSAyNDoKKwkJCXNuZF9zZXFfcXVldWVfdGVtcG9fc2V0X3RlbXBvKHF1ZXVlX3RlbXBvLCA1MDAwMDApOworCQkJc25kX3NlcV9xdWV1ZV90ZW1wb19zZXRfcHBxKHF1ZXVlX3RlbXBvLCAxMiAqIHRpbWVfZGl2aXNpb24pOworCQkJYnJlYWs7CisJCWNhc2UgMjU6CisJCQlzbmRfc2VxX3F1ZXVlX3RlbXBvX3NldF90ZW1wbyhxdWV1ZV90ZW1wbywgNDAwMDAwKTsKKwkJCXNuZF9zZXFfcXVldWVfdGVtcG9fc2V0X3BwcShxdWV1ZV90ZW1wbywgMTAgKiB0aW1lX2RpdmlzaW9uKTsKKwkJCWJyZWFrOworCQljYXNlIDI5OiAvKiAzMCBkcm9wLWZyYW1lICovCisJCQlzbmRfc2VxX3F1ZXVlX3RlbXBvX3NldF90ZW1wbyhxdWV1ZV90ZW1wbywgMTAwMDAwMDAwKTsKKwkJCXNuZF9zZXFfcXVldWVfdGVtcG9fc2V0X3BwcShxdWV1ZV90ZW1wbywgMjk5NyAqIHRpbWVfZGl2aXNpb24pOworCQkJYnJlYWs7CisJCWNhc2UgMzA6CisJCQlzbmRfc2VxX3F1ZXVlX3RlbXBvX3NldF90ZW1wbyhxdWV1ZV90ZW1wbywgNTAwMDAwKTsKKwkJCXNuZF9zZXFfcXVldWVfdGVtcG9fc2V0X3BwcShxdWV1ZV90ZW1wbywgMTUgKiB0aW1lX2RpdmlzaW9uKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyb3Jtc2coIiVzOiBpbnZhbGlkIG51bWJlciBvZiBTTVBURSBmcmFtZXMgcGVyIHNlY29uZCAoJWQpIiwKKwkJCQkgZmlsZV9uYW1lLCBpKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWVyciA9IHNuZF9zZXFfc2V0X3F1ZXVlX3RlbXBvKHNlcSwgcXVldWUsIHF1ZXVlX3RlbXBvKTsKKwlpZiAoZXJyIDwgMCkgeworCQllcnJvcm1zZygiQ2Fubm90IHNldCBxdWV1ZSB0ZW1wbyAoJXUvJWkpIiwKKwkJCSBzbmRfc2VxX3F1ZXVlX3RlbXBvX2dldF90ZW1wbyhxdWV1ZV90ZW1wbyksCisJCQkgc25kX3NlcV9xdWV1ZV90ZW1wb19nZXRfcHBxKHF1ZXVlX3RlbXBvKSk7CisJCXJldHVybiAwOworCX0KKworCS8qIHJlYWQgdHJhY2tzICovCisJZm9yIChpID0gMDsgaSA8IG51bV90cmFja3M7ICsraSkgeworCQlpbnQgbGVuOworCisJCS8qIHNlYXJjaCBmb3IgTVRyayBjaHVuayAqLworCQlmb3IgKDs7KSB7CisJCQlpbnQgaWQgPSByZWFkX2lkKCk7CisJCQlsZW4gPSByZWFkX2ludCg0KTsKKwkJCWlmIChmZW9mKGZpbGUpKSB7CisJCQkJZXJyb3Jtc2coIiVzOiB1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIiwgZmlsZV9uYW1lKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmIChsZW4gPCAwIHx8IGxlbiA+PSAweDEwMDAwMDAwKSB7CisJCQkJZXJyb3Jtc2coIiVzOiBpbnZhbGlkIGNodW5rIGxlbmd0aCAlZCIsIGZpbGVfbmFtZSwgbGVuKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmIChpZCA9PSBNQUtFX0lEKCdNJywgJ1QnLCAncicsICdrJykpCisJCQkJYnJlYWs7CisJCQlza2lwKGxlbik7CisJCX0KKwkJaWYgKCFyZWFkX3RyYWNrKCZ0cmFja3NbaV0sIGZpbGVfb2Zmc2V0ICsgbGVuKSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCByZWFkX3JpZmYodm9pZCkKK3sKKwkvKiBza2lwIGZpbGUgbGVuZ3RoICovCisJcmVhZF9ieXRlKCk7CisJcmVhZF9ieXRlKCk7CisJcmVhZF9ieXRlKCk7CisJcmVhZF9ieXRlKCk7CisKKwkvKiBjaGVjayBmaWxlIHR5cGUgKCJSTUlEIiA9IFJJRkYgTUlESSkgKi8KKwlpZiAocmVhZF9pZCgpICE9IE1BS0VfSUQoJ1InLCAnTScsICdJJywgJ0QnKSkgeworaW52YWxpZF9mb3JtYXQ6CisJCWVycm9ybXNnKCIlczogaW52YWxpZCBmaWxlIGZvcm1hdCIsIGZpbGVfbmFtZSk7CisJCXJldHVybiAwOworCX0KKwkvKiBzZWFyY2ggZm9yICJkYXRhIiBjaHVuayAqLworCWZvciAoOzspIHsKKwkJaW50IGlkID0gcmVhZF9pZCgpOworCQlpbnQgbGVuID0gcmVhZF8zMl9sZSgpOworCQlpZiAoZmVvZihmaWxlKSkgeworZGF0YV9ub3RfZm91bmQ6CisJCQllcnJvcm1zZygiJXM6IGRhdGEgY2h1bmsgbm90IGZvdW5kIiwgZmlsZV9uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChpZCA9PSBNQUtFX0lEKCdkJywgJ2EnLCAndCcsICdhJykpCisJCQlicmVhazsKKwkJaWYgKGxlbiA8IDApCisJCQlnb3RvIGRhdGFfbm90X2ZvdW5kOworCQlza2lwKChsZW4gKyAxKSAmIH4xKTsKKwl9CisJLyogdGhlICJkYXRhIiBjaHVuayBtdXN0IGNvbnRhaW4gZGF0YSBpbiBTTUYgZm9ybWF0ICovCisJaWYgKHJlYWRfaWQoKSAhPSBNQUtFX0lEKCdNJywgJ1QnLCAnaCcsICdkJykpCisJCWdvdG8gaW52YWxpZF9mb3JtYXQ7CisJcmV0dXJuIHJlYWRfc21mKCk7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfZmlsZV9kYXRhKHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IGV2ZW50ICpldmVudDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fdHJhY2tzOyArK2kpIHsKKwkJZXZlbnQgPSB0cmFja3NbaV0uZmlyc3RfZXZlbnQ7CisJCXdoaWxlIChldmVudCkgeworCQkJc3RydWN0IGV2ZW50ICpuZXh0ID0gZXZlbnQtPm5leHQ7CisJCQlmcmVlKGV2ZW50KTsKKwkJCWV2ZW50ID0gbmV4dDsKKwkJfQorCX0KKwludW1fdHJhY2tzID0gMDsKKwlmcmVlKHRyYWNrcyk7CisJdHJhY2tzID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2JpZ19zeXNleChzbmRfc2VxX2V2ZW50X3QgKmV2KQoreworCXVuc2lnbmVkIGludCBsZW5ndGg7CisJc3NpemVfdCBldmVudF9zaXplOworCWludCBlcnI7CisKKwlsZW5ndGggPSBldi0+ZGF0YS5leHQubGVuOworCWlmIChsZW5ndGggPiBNSURJX0JZVEVTX1BFUl9TRUMpCisJCWV2LT5kYXRhLmV4dC5sZW4gPSBNSURJX0JZVEVTX1BFUl9TRUM7CisJZXZlbnRfc2l6ZSA9IHNuZF9zZXFfZXZlbnRfbGVuZ3RoKGV2KTsKKwlpZiAoZXZlbnRfc2l6ZSArIDEgPiBzbmRfc2VxX2dldF9vdXRwdXRfYnVmZmVyX3NpemUoc2VxKSkgeworCQllcnIgPSBzbmRfc2VxX2RyYWluX291dHB1dChzZXEpOworCQljaGVja19zbmQoImRyYWluIG91dHB1dCIsIGVycik7CisJCWVyciA9IHNuZF9zZXFfc2V0X291dHB1dF9idWZmZXJfc2l6ZShzZXEsIGV2ZW50X3NpemUgKyAxKTsKKwkJY2hlY2tfc25kKCJzZXQgb3V0cHV0IGJ1ZmZlciBzaXplIiwgZXJyKTsKKwl9CisJd2hpbGUgKGxlbmd0aCA+IE1JRElfQllURVNfUEVSX1NFQykgeworCQllcnIgPSBzbmRfc2VxX2V2ZW50X291dHB1dChzZXEsIGV2KTsKKwkJY2hlY2tfc25kKCJvdXRwdXQgZXZlbnQiLCBlcnIpOworCQllcnIgPSBzbmRfc2VxX2RyYWluX291dHB1dChzZXEpOworCQljaGVja19zbmQoImRyYWluIG91dHB1dCIsIGVycik7CisJCWVyciA9IHNuZF9zZXFfc3luY19vdXRwdXRfcXVldWUoc2VxKTsKKwkJY2hlY2tfc25kKCJzeW5jIG91dHB1dCIsIGVycik7CisJCWlmIChzbGVlcCgxKSkKKwkJCWZhdGFsKCJhYm9ydGVkIik7CisJCWV2LT5kYXRhLmV4dC5wdHIgKz0gTUlESV9CWVRFU19QRVJfU0VDOworCQlsZW5ndGggLT0gTUlESV9CWVRFU19QRVJfU0VDOworCX0KKwlldi0+ZGF0YS5leHQubGVuID0gbGVuZ3RoOworfQorCitzdGF0aWMgdm9pZCBwbGF5X21pZGkodm9pZCkKK3sKKwlzbmRfc2VxX2V2ZW50X3QgZXY7CisJaW50IGksIG1heF90aWNrLCBlcnI7CisKKwkvKiBjYWxjdWxhdGUgbGVuZ3RoIG9mIHRoZSBlbnRpcmUgZmlsZSAqLworCW1heF90aWNrID0gLTE7CisJZm9yIChpID0gMDsgaSA8IG51bV90cmFja3M7ICsraSkgeworCQlpZiAodHJhY2tzW2ldLmVuZF90aWNrID4gbWF4X3RpY2spCisJCQltYXhfdGljayA9IHRyYWNrc1tpXS5lbmRfdGljazsKKwl9CisKKwkvKiBpbml0aWFsaXplIGN1cnJlbnQgcG9zaXRpb24gaW4gZWFjaCB0cmFjayAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fdHJhY2tzOyArK2kpCisJCXRyYWNrc1tpXS5jdXJyZW50X2V2ZW50ID0gdHJhY2tzW2ldLmZpcnN0X2V2ZW50OworCisJLyogY29tbW9uIHNldHRpbmdzIGZvciBhbGwgb3VyIGV2ZW50cyAqLworCXNuZF9zZXFfZXZfY2xlYXIoJmV2KTsKKwlldi5xdWV1ZSA9IHF1ZXVlOworCWV2LnNvdXJjZS5wb3J0ID0gMDsKKwlldi5mbGFncyA9IFNORF9TRVFfVElNRV9TVEFNUF9USUNLOworCisJZXJyID0gc25kX3NlcV9zdGFydF9xdWV1ZShzZXEsIHF1ZXVlLCBOVUxMKTsKKwljaGVja19zbmQoInN0YXJ0IHF1ZXVlIiwgZXJyKTsKKwkvKiBUaGUgcXVldWUgd29uJ3QgYmUgc3RhcnRlZCB1bnRpbCB0aGUgU1RBUlRfUVVFVUUgZXZlbnQgaXMKKwkgKiBhY3R1YWxseSBkcmFpbmVkIHRvIHRoZSBrZXJuZWwsIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCB3ZSB3YW50LiAqLworCisJZm9yICg7OykgeworCQlzdHJ1Y3QgZXZlbnQqIGV2ZW50ID0gTlVMTDsKKwkJc3RydWN0IHRyYWNrKiBldmVudF90cmFjayA9IE5VTEw7CisJCWludCBpLCBtaW5fdGljayA9IG1heF90aWNrICsgMTsKKworCQkvKiBzZWFyY2ggbmV4dCBldmVudCAqLworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3RyYWNrczsgKytpKSB7CisJCQlzdHJ1Y3QgdHJhY2sgKnRyYWNrID0gJnRyYWNrc1tpXTsKKwkJCXN0cnVjdCBldmVudCAqZTIgPSB0cmFjay0+Y3VycmVudF9ldmVudDsKKwkJCWlmIChlMiAmJiBlMi0+dGljayA8IG1pbl90aWNrKSB7CisJCQkJbWluX3RpY2sgPSBlMi0+dGljazsKKwkJCQlldmVudCA9IGUyOworCQkJCWV2ZW50X3RyYWNrID0gdHJhY2s7CisJCQl9CisJCX0KKwkJaWYgKCFldmVudCkKKwkJCWJyZWFrOyAvKiBlbmQgb2Ygc29uZyByZWFjaGVkICovCisKKwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgZXZlbnQgKi8KKwkJZXZlbnRfdHJhY2stPmN1cnJlbnRfZXZlbnQgPSBldmVudC0+bmV4dDsKKworCQkvKiBvdXRwdXQgdGhlIGV2ZW50ICovCisJCWV2LnR5cGUgPSBldmVudC0+dHlwZTsKKwkJZXYudGltZS50aWNrID0gZXZlbnQtPnRpY2s7CisJCWV2LmRlc3QgPSBwb3J0c1tldmVudC0+cG9ydF07CisJCXN3aXRjaCAoZXYudHlwZSkgeworCQljYXNlIFNORF9TRVFfRVZFTlRfTk9URU9OOgorCQljYXNlIFNORF9TRVFfRVZFTlRfTk9URU9GRjoKKwkJY2FzZSBTTkRfU0VRX0VWRU5UX0tFWVBSRVNTOgorCQkJc25kX3NlcV9ldl9zZXRfZml4ZWQoJmV2KTsKKwkJCWV2LmRhdGEubm90ZS5jaGFubmVsID0gZXZlbnQtPmRhdGEuZFswXTsKKwkJCWV2LmRhdGEubm90ZS5ub3RlID0gZXZlbnQtPmRhdGEuZFsxXTsKKwkJCWV2LmRhdGEubm90ZS52ZWxvY2l0eSA9IGV2ZW50LT5kYXRhLmRbMl07CisJCQlicmVhazsKKwkJY2FzZSBTTkRfU0VRX0VWRU5UX0NPTlRST0xMRVI6CisJCQlzbmRfc2VxX2V2X3NldF9maXhlZCgmZXYpOworCQkJZXYuZGF0YS5jb250cm9sLmNoYW5uZWwgPSBldmVudC0+ZGF0YS5kWzBdOworCQkJZXYuZGF0YS5jb250cm9sLnBhcmFtID0gZXZlbnQtPmRhdGEuZFsxXTsKKwkJCWV2LmRhdGEuY29udHJvbC52YWx1ZSA9IGV2ZW50LT5kYXRhLmRbMl07CisJCQlicmVhazsKKwkJY2FzZSBTTkRfU0VRX0VWRU5UX1BHTUNIQU5HRToKKwkJY2FzZSBTTkRfU0VRX0VWRU5UX0NIQU5QUkVTUzoKKwkJCXNuZF9zZXFfZXZfc2V0X2ZpeGVkKCZldik7CisJCQlldi5kYXRhLmNvbnRyb2wuY2hhbm5lbCA9IGV2ZW50LT5kYXRhLmRbMF07CisJCQlldi5kYXRhLmNvbnRyb2wudmFsdWUgPSBldmVudC0+ZGF0YS5kWzFdOworCQkJYnJlYWs7CisJCWNhc2UgU05EX1NFUV9FVkVOVF9QSVRDSEJFTkQ6CisJCQlzbmRfc2VxX2V2X3NldF9maXhlZCgmZXYpOworCQkJZXYuZGF0YS5jb250cm9sLmNoYW5uZWwgPSBldmVudC0+ZGF0YS5kWzBdOworCQkJZXYuZGF0YS5jb250cm9sLnZhbHVlID0KKwkJCQkoKGV2ZW50LT5kYXRhLmRbMV0pIHwKKwkJCQkgKChldmVudC0+ZGF0YS5kWzJdKSA8PCA3KSkgLSAweDIwMDA7CisJCQlicmVhazsKKwkJY2FzZSBTTkRfU0VRX0VWRU5UX1NZU0VYOgorCQkJc25kX3NlcV9ldl9zZXRfdmFyaWFibGUoJmV2LCBldmVudC0+ZGF0YS5sZW5ndGgsCisJCQkJCQlldmVudC0+c3lzZXgpOworCQkJaGFuZGxlX2JpZ19zeXNleCgmZXYpOworCQkJYnJlYWs7CisJCWNhc2UgU05EX1NFUV9FVkVOVF9URU1QTzoKKwkJCXNuZF9zZXFfZXZfc2V0X2ZpeGVkKCZldik7CisJCQlldi5kZXN0LmNsaWVudCA9IFNORF9TRVFfQ0xJRU5UX1NZU1RFTTsKKwkJCWV2LmRlc3QucG9ydCA9IFNORF9TRVFfUE9SVF9TWVNURU1fVElNRVI7CisJCQlldi5kYXRhLnF1ZXVlLnF1ZXVlID0gcXVldWU7CisJCQlldi5kYXRhLnF1ZXVlLnBhcmFtLnZhbHVlID0gZXZlbnQtPmRhdGEudGVtcG87CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZhdGFsKCJJbnZhbGlkIGV2ZW50IHR5cGUgJWQhIiwgZXYudHlwZSk7CisJCX0KKworCQkvKiB0aGlzIGJsb2NrcyB3aGVuIHRoZSBvdXRwdXQgcG9vbCBoYXMgYmVlbiBmaWxsZWQgKi8KKwkJZXJyID0gc25kX3NlcV9ldmVudF9vdXRwdXQoc2VxLCAmZXYpOworCQljaGVja19zbmQoIm91dHB1dCBldmVudCIsIGVycik7CisJfQorCisJLyogc2NoZWR1bGUgcXVldWUgc3RvcCBhdCBlbmQgb2Ygc29uZyAqLworCXNuZF9zZXFfZXZfc2V0X2ZpeGVkKCZldik7CisJZXYudHlwZSA9IFNORF9TRVFfRVZFTlRfU1RPUDsKKwlldi50aW1lLnRpY2sgPSBtYXhfdGljazsKKwlldi5kZXN0LmNsaWVudCA9IFNORF9TRVFfQ0xJRU5UX1NZU1RFTTsKKwlldi5kZXN0LnBvcnQgPSBTTkRfU0VRX1BPUlRfU1lTVEVNX1RJTUVSOworCWV2LmRhdGEucXVldWUucXVldWUgPSBxdWV1ZTsKKwllcnIgPSBzbmRfc2VxX2V2ZW50X291dHB1dChzZXEsICZldik7CisJY2hlY2tfc25kKCJvdXRwdXQgZXZlbnQiLCBlcnIpOworCisJLyogbWFrZSBzdXJlIHRoYXQgdGhlIHNlcXVlbmNlciBzZWVzIGFsbCBvdXIgZXZlbnRzICovCisJZXJyID0gc25kX3NlcV9kcmFpbl9vdXRwdXQoc2VxKTsKKwljaGVja19zbmQoImRyYWluIG91dHB1dCIsIGVycik7CisKKwkvKgorCSAqIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJpbGl0aWVzIGhvdyB0byB3YWl0IHVudGlsIGFsbCBldmVudHMgaGF2ZQorCSAqIGJlZW4gcGxheWVkOgorCSAqIDEpIHNlbmQgYW4gZXZlbnQgYmFjayB0byB1cyAobGlrZSBwbWlkaSBkb2VzKSwgYW5kIHdhaXQgZm9yIGl0OworCSAqIDIpIHdhaXQgZm9yIHRoZSBFVkVOVF9TVE9QIG5vdGlmaWNhdGlvbiBmb3Igb3VyIHF1ZXVlIHdoaWNoIGlzIHNlbnQKKwkgKiAgICBieSB0aGUgc3lzdGVtIHRpbWVyIHBvcnQgKHRoaXMgd291bGQgcmVxdWlyZSBhIHN1YnNjcmlwdGlvbik7CisJICogMykgd2FpdCB1bnRpbCB0aGUgb3V0cHV0IHBvb2wgaXMgZW1wdHkuCisJICogVGhlIGxhc3QgaXMgdGhlIHNpbXBsZXN0LgorCSAqLworCWVyciA9IHNuZF9zZXFfc3luY19vdXRwdXRfcXVldWUoc2VxKTsKKwljaGVja19zbmQoInN5bmMgb3V0cHV0IiwgZXJyKTsKKworCS8qIGdpdmUgdGhlIGxhc3Qgbm90ZXMgdGltZSB0byBkaWUgYXdheSAqLworCWlmIChlbmRfZGVsYXkgPiAwKQorCQlzbGVlcChlbmRfZGVsYXkpOworfQorCitzdGF0aWMgdm9pZCBwbGF5X2ZpbGUodm9pZCkKK3sKKwlpbnQgb2s7CisKKwlpZiAoIXN0cmNtcChmaWxlX25hbWUsICItIikpCisJCWZpbGUgPSBzdGRpbjsKKwllbHNlCisJCWZpbGUgPSBmb3BlbihmaWxlX25hbWUsICJyYiIpOworCWlmICghZmlsZSkgeworCQllcnJvcm1zZygiQ2Fubm90IG9wZW4gJXMgLSAlcyIsIGZpbGVfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuOworCX0KKworCWZpbGVfb2Zmc2V0ID0gMDsKKwlvayA9IDA7CisKKwlzd2l0Y2ggKHJlYWRfaWQoKSkgeworCWNhc2UgTUFLRV9JRCgnTScsICdUJywgJ2gnLCAnZCcpOgorCQlvayA9IHJlYWRfc21mKCk7CisJCWJyZWFrOworCWNhc2UgTUFLRV9JRCgnUicsICdJJywgJ0YnLCAnRicpOgorCQlvayA9IHJlYWRfcmlmZigpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnJvcm1zZygiJXMgaXMgbm90IGEgU3RhbmRhcmQgTUlESSBGaWxlIiwgZmlsZV9uYW1lKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGZpbGUgIT0gc3RkaW4pCisJCWZjbG9zZShmaWxlKTsKKworCWlmIChvaykKKwkJcGxheV9taWRpKCk7CisKKwljbGVhbnVwX2ZpbGVfZGF0YSgpOworfQorCitzdGF0aWMgdm9pZCBsaXN0X3BvcnRzKHZvaWQpCit7CisJc25kX3NlcV9jbGllbnRfaW5mb190ICpjaW5mbzsKKwlzbmRfc2VxX3BvcnRfaW5mb190ICpwaW5mbzsKKworCXNuZF9zZXFfY2xpZW50X2luZm9fYWxsb2NhKCZjaW5mbyk7CisJc25kX3NlcV9wb3J0X2luZm9fYWxsb2NhKCZwaW5mbyk7CisKKwlwdXRzKCIgUG9ydCAgICBDbGllbnQgbmFtZSAgICAgICAgICAgICAgICAgICAgICBQb3J0IG5hbWUiKTsKKworCXNuZF9zZXFfY2xpZW50X2luZm9fc2V0X2NsaWVudChjaW5mbywgLTEpOworCXdoaWxlIChzbmRfc2VxX3F1ZXJ5X25leHRfY2xpZW50KHNlcSwgY2luZm8pID49IDApIHsKKwkJaW50IGNsaWVudCA9IHNuZF9zZXFfY2xpZW50X2luZm9fZ2V0X2NsaWVudChjaW5mbyk7CisKKwkJc25kX3NlcV9wb3J0X2luZm9fc2V0X2NsaWVudChwaW5mbywgY2xpZW50KTsKKwkJc25kX3NlcV9wb3J0X2luZm9fc2V0X3BvcnQocGluZm8sIC0xKTsKKwkJd2hpbGUgKHNuZF9zZXFfcXVlcnlfbmV4dF9wb3J0KHNlcSwgcGluZm8pID49IDApIHsKKwkJCS8qIHBvcnQgbXVzdCB1bmRlcnN0YW5kIE1JREkgbWVzc2FnZXMgKi8KKwkJCWlmICghKHNuZF9zZXFfcG9ydF9pbmZvX2dldF90eXBlKHBpbmZvKQorCQkJICAgICAgJiBTTkRfU0VRX1BPUlRfVFlQRV9NSURJX0dFTkVSSUMpKQorCQkJCWNvbnRpbnVlOworCQkJLyogd2UgbmVlZCBib3RoIFdSSVRFIGFuZCBTVUJTX1dSSVRFICovCisJCQlpZiAoKHNuZF9zZXFfcG9ydF9pbmZvX2dldF9jYXBhYmlsaXR5KHBpbmZvKQorCQkJICAgICAmIChTTkRfU0VRX1BPUlRfQ0FQX1dSSVRFIHwgU05EX1NFUV9QT1JUX0NBUF9TVUJTX1dSSVRFKSkKKwkJCSAgICAhPSAoU05EX1NFUV9QT1JUX0NBUF9XUklURSB8IFNORF9TRVFfUE9SVF9DQVBfU1VCU19XUklURSkpCisJCQkJY29udGludWU7CisJCQlwcmludGYoIiUzZDolLTNkICAlLTMyLjMycyAlc1xuIiwKKwkJCSAgICAgICBzbmRfc2VxX3BvcnRfaW5mb19nZXRfY2xpZW50KHBpbmZvKSwKKwkJCSAgICAgICBzbmRfc2VxX3BvcnRfaW5mb19nZXRfcG9ydChwaW5mbyksCisJCQkgICAgICAgc25kX3NlcV9jbGllbnRfaW5mb19nZXRfbmFtZShjaW5mbyksCisJCQkgICAgICAgc25kX3NlcV9wb3J0X2luZm9fZ2V0X25hbWUocGluZm8pKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciAqYXJndjApCit7CisJcHJpbnRmKAorCQkiVXNhZ2U6ICVzIC1wIGNsaWVudDpwb3J0WywuLi5dIFstZCBkZWxheV0gbWlkaWZpbGUgLi4uXG4iCisJCSItaCwgLS1oZWxwICAgICAgICAgICAgICAgICAgdGhpcyBoZWxwXG4iCisJCSItViwgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgY3VycmVudCB2ZXJzaW9uXG4iCisJCSItbCwgLS1saXN0ICAgICAgICAgICAgICAgICAgbGlzdCBhbGwgcG9zc2libGUgb3V0cHV0IHBvcnRzXG4iCisJCSItcCwgLS1wb3J0PWNsaWVudDpwb3J0LC4uLiAgc2V0IHBvcnQocykgdG8gcGxheSB0b1xuIgorCQkiLWQsIC0tZGVsYXk9c2Vjb25kcyAgICAgICAgIGRlbGF5IGFmdGVyIHNvbmcgZW5kc1xuIiwKKwkJYXJndjApOworfQorCitzdGF0aWMgdm9pZCB2ZXJzaW9uKHZvaWQpCit7CisJcHV0cygiYXBsYXltaWRpIHZlcnNpb24gIiBTTkRfVVRJTF9WRVJTSU9OX1NUUik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgc2hvcnRfb3B0aW9uc1tdID0gImhWbHA6ZDoiOworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0geworCQl7ImhlbHAiLCAwLCBOVUxMLCAnaCd9LAorCQl7InZlcnNpb24iLCAwLCBOVUxMLCAnVid9LAorCQl7Imxpc3QiLCAwLCBOVUxMLCAnbCd9LAorCQl7InBvcnQiLCAxLCBOVUxMLCAncCd9LAorCQl7ImRlbGF5IiwgMSwgTlVMTCwgJ2QnfSwKKwkJe30KKwl9OworCWludCBjOworCWludCBkb19saXN0ID0gMDsKKworCWluaXRfc2VxKCk7CisKKwl3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCBzaG9ydF9vcHRpb25zLAorCQkJCWxvbmdfb3B0aW9ucywgTlVMTCkpICE9IC0xKSB7CisJCXN3aXRjaCAoYykgeworCQljYXNlICdoJzoKKwkJCXVzYWdlKGFyZ3ZbMF0pOworCQkJcmV0dXJuIDA7CisJCWNhc2UgJ1YnOgorCQkJdmVyc2lvbigpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgJ2wnOgorCQkJZG9fbGlzdCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlwYXJzZV9wb3J0cyhvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJZW5kX2RlbGF5ID0gYXRvaShvcHRhcmcpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl1c2FnZShhcmd2WzBdKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJaWYgKGRvX2xpc3QpIHsKKwkJbGlzdF9wb3J0cygpOworCX0gZWxzZSB7CisJCWlmIChwb3J0X2NvdW50IDwgMSkgeworCQkJLyogdXNlIGVudiB2YXIgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBwbWlkaSAqLworCQkJY29uc3QgY2hhciAqcG9ydHNfc3RyID0gZ2V0ZW52KCJBTFNBX09VVFBVVF9QT1JUUyIpOworCQkJaWYgKHBvcnRzX3N0cikKKwkJCQlwYXJzZV9wb3J0cyhwb3J0c19zdHIpOworCQkJaWYgKHBvcnRfY291bnQgPCAxKSB7CisJCQkJZXJyb3Jtc2coIlBsZWFzZSBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBwb3J0IHdpdGggLS1wb3J0LiIpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJCWlmIChvcHRpbmQgPj0gYXJnYykgeworCQkJZXJyb3Jtc2coIlBsZWFzZSBzcGVjaWZ5IGEgZmlsZSB0byBwbGF5LiIpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQljcmVhdGVfc291cmNlX3BvcnQoKTsKKwkJY3JlYXRlX3F1ZXVlKCk7CisJCWNvbm5lY3RfcG9ydHMoKTsKKworCQlmb3IgKDsgb3B0aW5kIDwgYXJnYzsgKytvcHRpbmQpIHsKKwkJCWZpbGVfbmFtZSA9IGFyZ3Zbb3B0aW5kXTsKKwkJCXBsYXlfZmlsZSgpOworCQl9CisJfQorCXNuZF9zZXFfY2xvc2Uoc2VxKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NlcS9hcGxheW1pZGkvYXJlY29yZG1pZGkuMSBiL3NlcS9hcGxheW1pZGkvYXJlY29yZG1pZGkuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGIzYTNhCi0tLSAvZGV2L251bGwKKysrIGIvc2VxL2FwbGF5bWlkaS9hcmVjb3JkbWlkaS4xCkBAIC0wLDAgKzEsODIgQEAKKy5USCBBUkVDT1JETUlESSAxICIxNyBTZXAgMjAwNyIKKworLlNIIE5BTUUKK2FyZWNvcmRtaWRpIFwtIHJlY29yZCBTdGFuZGFyZCBNSURJIEZpbGVzCisKKy5TSCBTWU5PUFNJUworLkIgYXJlY29yZG1pZGkKK1wtcCBjbGllbnQ6cG9ydFssLi4uXSBbb3B0aW9uc10gbWlkaWZpbGUKKworLlNIIERFU0NSSVBUSU9OCisuQiBhcmVjb3JkbWlkaQoraXMgYSBjb21tYW5kLWxpbmUgdXRpbGl0eSB0aGF0IHJlY29yZHMgYSBTdGFuZGFyZCBNSURJIEZpbGUgZnJvbSBvbmUgb3IKK21vcmUgQUxTQSBzZXF1ZW5jZXIgcG9ydHMuCisKK1RvIHN0b3AgcmVjb3JkaW5nLCBwcmVzcyBDdHJsK0MuCisKKy5TSCBPUFRJT05TCisKKy5UUAorLkkgXC1oLFwtXC1oZWxwCitQcmludHMgYSBsaXN0IG9mIG9wdGlvbnMuCisKKy5UUAorLkkgXC1WLFwtXC12ZXJzaW9uCitQcmludHMgdGhlIGN1cnJlbnQgdmVyc2lvbi4KKworLlRQCisuSSBcLWwsXC1cLWxpc3QKK1ByaW50cyBhIGxpc3Qgb2YgcG9zc2libGUgaW5wdXQgcG9ydHMuCisKKy5UUAorLkkgXC1wLFwtXC1wb3J0PWNsaWVudDpwb3J0LC4uLgorU2V0cyB0aGUgc2VxdWVuY2VyIHBvcnQocykgZnJvbSB3aGljaCBldmVudHMgYXJlIHJlY29yZGVkLgorCitBIGNsaWVudCBjYW4gYmUgc3BlY2lmaWVkIGJ5IGl0cyBudW1iZXIsIGl0cyBuYW1lLCBvciBhIHByZWZpeCBvZiBpdHMKK25hbWUuIEEgcG9ydCBpcyBzcGVjaWZpZWQgYnkgaXRzIG51bWJlcjsgZm9yIHBvcnQgMCBvZiBhIGNsaWVudCwgdGhlCisiOjAiIHBhcnQgb2YgdGhlIHBvcnQgc3BlY2lmaWNhdGlvbiBjYW4gYmUgb21pdHRlZC4KKworLlRQCisuSSBcLWIsXC1cLWJwbT1iZWF0cworU2V0cyB0aGUgbXVzaWNhbCB0ZW1wbyBvZiB0aGUgTUlESSBmaWxlLCBpbiBiZWF0cyBwZXIgbWludXRlLgorVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTIwIEJQTS4KKworLlRQCisuSSBcLWYsXC1cLWZwcz1mcmFtZXMKK1NldHMgdGhlIFNNUFRFIHJlc29sdXRpb24sIGluIGZyYW1lcyBwZXIgc2Vjb25kLgorUG9zc2libGUgdmFsdWVzIGFyZSAyNCwgMjUsIDI5Ljk3IChmb3IgMzAgZHJvcC1mcmFtZSksIGFuZCAzMC4KKworLlRQCisuSSBcLXQsXC1cLXRpY2tzPXRpY2tzCitTZXRzIHRoZSByZXNvbHV0aW9uIG9mIHRpbWVzdGFtcHMgKHRpY2tzKSBpbiB0aGUgTUlESSBmaWxlLAoraW4gdGlja3MgcGVyIGJlYXQgKHdoZW4gdXNpbmcgbXVzaWNhbCB0ZW1wbykgb3IgdGlja3MgcGVyIGZyYW1lCisod2hlbiB1c2luZyBTTVBURSB0aW1pbmcpLgorVGhlIGRlZmF1bHQgdmFsdWUgaXMgMzg0IHRpY2tzL2JlYXQgb3IgNDAgdGlja3MvZnJhbWUsIHJlc3BlY3RpdmVseS4KKworLlRQCisuSSBcLXMsXC1cLXNwbGl0XC1jaGFubmVscworU3BlY2lmaWVzIHRoYXQgdGhlIGRhdGEgZm9yIGVhY2ggTUlESSBjaGFubmVsIHNob3VsZCBiZSB3cml0dGVuIHRvIGEKK3NlcGFyYXRlIHRyYWNrIGluIHRoZSBNSURJIGZpbGUuCitUaGlzIHdpbGwgcmVzdWx0IGluIGEgImZvcm1hdCAxIiBmaWxlLgorT3RoZXJ3aXNlLCB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIHRyYWNrLAorLkIgYXJlY29yZG1pZGkKK3dpbGwgZ2VuZXJhdGUgYSAiZm9ybWF0IDAiIGZpbGUuCisKKy5UUAorLkkgXC1tLFwtXC1tZXRyb25vbWU9Y2xpZW50OnBvcnQKK1BsYXlzIGEgbWV0cm9ub21lIHNpZ25hbCBvbiB0aGUgc3BlY2lmaWVkIHNlcXVlbmNlciBwb3J0LgorCitNZXRyb25vbWUgc291bmRzIGFyZSBwbGF5ZWQgb24gY2hhbm5lbCAxMCwgTUlESSBub3RlcyAzMyAmIDM0IChHTTIvR1MvWEcgCittZXRyb25vbWUgc3RhbmRhcmQgbm90ZXMpLCB3aXRoIHZlbG9jaXR5IDEwMCBhbmQgZHVyYXRpb24gMS4KKworLlRQCisuSSBcLWksXC1cLXRpbWVzaWc9bnVtZXJhdG9yOmRlbm9taW5hdG9yCitTZXRzIHRoZSB0aW1lIHNpZ25hdHVyZSBmb3IgdGhlIE1JREkgZmlsZSBhbmQgbWV0cm9ub21lLgorCitUaGUgdGltZSBzaWduYXR1cmUgaXMgc3BlY2lmaWVkIGFzIHVzdWFsIHdpdGggdHdvIG51bWJlcnMsIHJlcHJlc2VudGluZwordGhlIG51bWVyYXRvciBhbmQgZGVub21pbmF0b3Igb2YgdGhlIHRpbWUgc2lnbmF0dXJlIGFzIGl0IHdvdWxkIGJlIAorbm90YXRlZC4gVGhlIGRlbm9taW5hdG9yIG11c3QgYmUgYSBwb3dlciBvZiB0d28uIEJvdGggbnVtYmVycyBzaG91bGQgYmUKK3NlcGFyYXRlZCBieSBhIGNvbG9uLiBUaGUgdGltZSBzaWduYXR1cmUgaXMgNDo0IGJ5IGRlZmF1bHQuCisKKy5TSCBBVVRIT1IKK0NsZW1lbnMgTGFkaXNjaCA8Y2xlbWVuc0BsYWRpc2NoLmRlPgpkaWZmIC0tZ2l0IGEvc2VxL2FwbGF5bWlkaS9hcmVjb3JkbWlkaS5jIGIvc2VxL2FwbGF5bWlkaS9hcmVjb3JkbWlkaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MjgwODYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXEvYXBsYXltaWRpL2FyZWNvcmRtaWRpLmMKQEAgLTAsMCArMSw4ODAgQEAKKy8qCisgKiBhcmVjb3JkbWlkaS5jIC0gcmVjb3JkIHN0YW5kYXJkIE1JREkgZmlsZXMgZnJvbSBzZXF1ZW5jZXIgcG9ydHMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4KKyAqCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKiBUT0RPOiBzZXF1ZW5jZXIgcXVldWUgdGltZXIgc2VsZWN0aW9uICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjaW5jbHVkZSA8YWxzYS9hc291bmRsaWIuaD4KKyNpbmNsdWRlICJhY29uZmlnLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCisjZGVmaW5lIEJVRkZFUl9TSVpFIDQwODgKKworLyogbGlua2VkIGxpc3Qgb2YgYnVmZmVycywgc3RvcmVzIGRhdGEgYXMgaW4gdGhlIC5taWQgZmlsZSAqLworc3RydWN0IGJ1ZmZlciB7CisJc3RydWN0IGJ1ZmZlciAqbmV4dDsKKwl1bnNpZ25lZCBjaGFyIGJ1ZltCVUZGRVJfU0laRV07Cit9OworCitzdHJ1Y3Qgc21mX3RyYWNrIHsKKwlpbnQgc2l6ZTsJCQkvKiBzaXplIG9mIGVudGlyZSBkYXRhICovCisJaW50IGN1cl9idWZfc2l6ZTsJCS8qIHNpemUgb2YgY3VyX2J1ZiAqLworCXN0cnVjdCBidWZmZXIgKmN1cl9idWY7CisJc25kX3NlcV90aWNrX3RpbWVfdCBsYXN0X3RpY2s7CS8qIGVuZCBvZiB0cmFjayAqLworCXVuc2lnbmVkIGNoYXIgbGFzdF9jb21tYW5kOwkvKiB1c2VkIGZvciBydW5uaW5nIHN0YXR1cyAqLworCWludCB1c2VkOwkJCS8qIGFueXRoaW5nIHJlY29yZCBvbiB0aGlzIHRyYWNrICovCisJc3RydWN0IGJ1ZmZlciBmaXJzdF9idWY7CS8qIGxpc3QgaGVhZCAqLworfTsKKworLyogdGltaW5nL3N5c2V4ICsgMTYgY2hhbm5lbHMgKi8KKyNkZWZpbmUgVFJBQ0tTX1BFUl9QT1JUIDE3CisKKy8qIG1ldHJvbm9tZSBzZXR0aW5ncyAqLworLyogVE9ETzogY3JlYXRlIG9wdGlvbnMgZm9yIHRoaXMgKi8KKyNkZWZpbmUgTUVUUk9OT01FX0NIQU5ORUwgOQorI2RlZmluZSBNRVRST05PTUVfU1RST05HX05PVEUgMzQKKyNkZWZpbmUgTUVUUk9OT01FX1dFQUtfTk9URSAzMworI2RlZmluZSBNRVRST05PTUVfVkVMT0NJVFkgMTAwCisjZGVmaW5lIE1FVFJPTk9NRV9QUk9HUkFNIDAKKworc3RhdGljIHNuZF9zZXFfdCAqc2VxOworc3RhdGljIGludCBjbGllbnQ7CitzdGF0aWMgaW50IHBvcnRfY291bnQ7CitzdGF0aWMgc25kX3NlcV9hZGRyX3QgKnBvcnRzOworc3RhdGljIGludCBxdWV1ZTsKK3N0YXRpYyBpbnQgc21wdGVfdGltaW5nID0gMDsKK3N0YXRpYyBpbnQgYmVhdHMgPSAxMjA7CitzdGF0aWMgaW50IGZyYW1lczsKK3N0YXRpYyBpbnQgdGlja3MgPSAwOworc3RhdGljIEZJTEUgKmZpbGU7CitzdGF0aWMgaW50IGNoYW5uZWxfc3BsaXQ7CitzdGF0aWMgaW50IG51bV90cmFja3M7CitzdGF0aWMgc3RydWN0IHNtZl90cmFjayAqdHJhY2tzOworc3RhdGljIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBzdG9wID0gMDsKK3N0YXRpYyBpbnQgdXNlX21ldHJvbm9tZSA9IDA7CitzdGF0aWMgc25kX3NlcV9hZGRyX3QgbWV0cm9ub21lX3BvcnQ7CitzdGF0aWMgaW50IG1ldHJvbm9tZV93ZWFrX25vdGUgPSBNRVRST05PTUVfV0VBS19OT1RFOworc3RhdGljIGludCBtZXRyb25vbWVfc3Ryb25nX25vdGUgPSBNRVRST05PTUVfU1RST05HX05PVEU7CitzdGF0aWMgaW50IG1ldHJvbm9tZV92ZWxvY2l0eSA9IE1FVFJPTk9NRV9WRUxPQ0lUWTsKK3N0YXRpYyBpbnQgbWV0cm9ub21lX3Byb2dyYW0gPSBNRVRST05PTUVfUFJPR1JBTTsKK3N0YXRpYyBpbnQgbWV0cm9ub21lX2NoYW5uZWwgPSBNRVRST05PTUVfQ0hBTk5FTDsKK3N0YXRpYyBpbnQgdHNfbnVtID0gNDsgLyogdGltZSBzaWduYXR1cmU6IG51bWVyYXRvciAqLworc3RhdGljIGludCB0c19kaXYgPSA0OyAvKiB0aW1lIHNpZ25hdHVyZTogZGVub21pbmF0b3IgKi8KK3N0YXRpYyBpbnQgdHNfZGQgPSAyOyAvKiB0aW1lIHNpZ25hdHVyZTogZGVub21pbmF0b3IgYXMgYSBwb3dlciBvZiB0d28gKi8KKworCisvKiBwcmludHMgYW4gZXJyb3IgbWVzc2FnZSB0byBzdGRlcnIsIGFuZCBkaWVzICovCitzdGF0aWMgdm9pZCBmYXRhbChjb25zdCBjaGFyICptc2csIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJdmFfc3RhcnQoYXAsIG1zZyk7CisJdmZwcmludGYoc3RkZXJyLCBtc2csIGFwKTsKKwl2YV9lbmQoYXApOworCWZwdXRjKCdcbicsIHN0ZGVycik7CisJZXhpdChFWElUX0ZBSUxVUkUpOworfQorCisvKiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvciBoYW5kbGluZyAqLworc3RhdGljIHZvaWQgY2hlY2tfbWVtKHZvaWQgKnApCit7CisJaWYgKCFwKQorCQlmYXRhbCgiT3V0IG9mIG1lbW9yeSIpOworfQorCisvKiBlcnJvciBoYW5kbGluZyBmb3IgQUxTQSBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIGNoZWNrX3NuZChjb25zdCBjaGFyICpvcGVyYXRpb24sIGludCBlcnIpCit7CisJaWYgKGVyciA8IDApCisJCWZhdGFsKCJDYW5ub3QgJXMgLSAlcyIsIG9wZXJhdGlvbiwgc25kX3N0cmVycm9yKGVycikpOworfQorCitzdGF0aWMgdm9pZCBpbml0X3NlcSh2b2lkKQoreworCWludCBlcnI7CisKKwkvKiBvcGVuIHNlcXVlbmNlciAqLworCWVyciA9IHNuZF9zZXFfb3Blbigmc2VxLCAiZGVmYXVsdCIsIFNORF9TRVFfT1BFTl9EVVBMRVgsIDApOworCWNoZWNrX3NuZCgib3BlbiBzZXF1ZW5jZXIiLCBlcnIpOworCisJLyogZmluZCBvdXQgb3VyIGNsaWVudCdzIGlkICovCisJY2xpZW50ID0gc25kX3NlcV9jbGllbnRfaWQoc2VxKTsKKwljaGVja19zbmQoImdldCBjbGllbnQgaWQiLCBjbGllbnQpOworCisJLyogc2V0IG91ciBjbGllbnQncyBuYW1lICovCisJZXJyID0gc25kX3NlcV9zZXRfY2xpZW50X25hbWUoc2VxLCAiYXJlY29yZG1pZGkiKTsKKwljaGVja19zbmQoInNldCBjbGllbnQgbmFtZSIsIGVycik7Cit9CisKKy8qIHBhcnNlcyBvbmUgb3IgbW9yZSBwb3J0IGFkZHJlc3NlcyBmcm9tIHRoZSBzdHJpbmcgKi8KK3N0YXRpYyB2b2lkIHBhcnNlX3BvcnRzKGNvbnN0IGNoYXIgKmFyZykKK3sKKwljaGFyICpidWYsICpzLCAqcG9ydF9uYW1lOworCWludCBlcnI7CisKKwkvKiBtYWtlIGEgY29weSBvZiB0aGUgc3RyaW5nIGJlY2F1c2Ugd2UncmUgZ29pbmcgdG8gbW9kaWZ5IGl0ICovCisJYnVmID0gc3RyZHVwKGFyZyk7CisJY2hlY2tfbWVtKGJ1Zik7CisKKwlmb3IgKHBvcnRfbmFtZSA9IHMgPSBidWY7IHM7IHBvcnRfbmFtZSA9IHMgKyAxKSB7CisJCS8qIEFzc3VtZSB0aGF0IHBvcnRzIGFyZSBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgV2UgZG9uJ3QgdXNlCisJCSAqIHNwYWNlcyBiZWNhdXNlIHRob3NlIGFyZSB2YWxpZCBpbiBjbGllbnQgbmFtZXMuICovCisJCXMgPSBzdHJjaHIocG9ydF9uYW1lLCAnLCcpOworCQlpZiAocykKKwkJCSpzID0gJ1wwJzsKKworCQkrK3BvcnRfY291bnQ7CisJCXBvcnRzID0gcmVhbGxvYyhwb3J0cywgcG9ydF9jb3VudCAqIHNpemVvZihzbmRfc2VxX2FkZHJfdCkpOworCQljaGVja19tZW0ocG9ydHMpOworCisJCWVyciA9IHNuZF9zZXFfcGFyc2VfYWRkcmVzcyhzZXEsICZwb3J0c1twb3J0X2NvdW50IC0gMV0sIHBvcnRfbmFtZSk7CisJCWlmIChlcnIgPCAwKQorCQkJZmF0YWwoIkludmFsaWQgcG9ydCAlcyAtICVzIiwgcG9ydF9uYW1lLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJfQorCisJZnJlZShidWYpOworfQorCisvKiBwYXJzZXMgdGhlIG1ldHJvbm9tZSBwb3J0IGFkZHJlc3MgKi8KK3N0YXRpYyB2b2lkIGluaXRfbWV0cm9ub21lKGNvbnN0IGNoYXIgKmFyZykKK3sKKwlpbnQgZXJyOworCisJZXJyID0gc25kX3NlcV9wYXJzZV9hZGRyZXNzKHNlcSwgJm1ldHJvbm9tZV9wb3J0LCBhcmcpOworCWlmIChlcnIgPCAwKQorCQlmYXRhbCgiSW52YWxpZCBwb3J0ICVzIC0gJXMiLCBhcmcsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwl1c2VfbWV0cm9ub21lID0gMTsKK30KKworLyogcGFyc2VzIHRpbWUgc2lnbmF0dXJlIHNwZWNpZmljYXRpb24gKi8KK3N0YXRpYyB2b2lkIHRpbWVfc2lnbmF0dXJlKGNvbnN0IGNoYXIgKmFyZykKK3sKKwlsb25nIHggPSAwOworCWNoYXIgKnNlcDsKKworCXggPSBzdHJ0b2woYXJnLCAmc2VwLCAxMCk7CisJaWYgKHggPCAxIHx8IHggPiA2NCB8fCAqc2VwICE9ICc6JykKKwkJZmF0YWwoIkludmFsaWQgdGltZSBzaWduYXR1cmUgKCVzKSIsIGFyZyk7CisJdHNfbnVtID0geDsKKwl4ID0gc3RydG9sKCsrc2VwLCBOVUxMLCAxMCk7CisJaWYgKHggPCAxIHx8IHggPiA2NCkKKwkJZmF0YWwoIkludmFsaWQgdGltZSBzaWduYXR1cmUgKCVzKSIsIGFyZyk7CisJdHNfZGl2ID0geDsKKwlmb3IgKHRzX2RkID0gMDsgeCA+IDE7IHggLz0gMikKKwkJKyt0c19kZDsKK30KKworLyoKKyAqIE1ldHJvbm9tZSBpbXBsZW1lbnRhdGlvbgorICovCitzdGF0aWMgdm9pZCBtZXRyb25vbWVfbm90ZSh1bnNpZ25lZCBjaGFyIG5vdGUsIHVuc2lnbmVkIGludCB0aWNrKQoreworCXNuZF9zZXFfZXZlbnRfdCBldjsKKwlzbmRfc2VxX2V2X2NsZWFyKCZldik7CisJc25kX3NlcV9ldl9zZXRfbm90ZSgmZXYsIG1ldHJvbm9tZV9jaGFubmVsLCBub3RlLCBtZXRyb25vbWVfdmVsb2NpdHksIDEpOworCXNuZF9zZXFfZXZfc2NoZWR1bGVfdGljaygmZXYsIHF1ZXVlLCAwLCB0aWNrKTsKKwlzbmRfc2VxX2V2X3NldF9zb3VyY2UoJmV2LCBwb3J0X2NvdW50KTsKKwlzbmRfc2VxX2V2X3NldF9zdWJzKCZldik7CisJc25kX3NlcV9ldmVudF9vdXRwdXQoc2VxLCAmZXYpOworfQorCitzdGF0aWMgdm9pZCBtZXRyb25vbWVfZWNobyh1bnNpZ25lZCBpbnQgdGljaykKK3sKKwlzbmRfc2VxX2V2ZW50X3QgZXY7CisJc25kX3NlcV9ldl9jbGVhcigmZXYpOworCWV2LnR5cGUgPSBTTkRfU0VRX0VWRU5UX1VTUjA7CisJc25kX3NlcV9ldl9zY2hlZHVsZV90aWNrKCZldiwgcXVldWUsIDAsIHRpY2spOworCXNuZF9zZXFfZXZfc2V0X3NvdXJjZSgmZXYsIHBvcnRfY291bnQpOworCXNuZF9zZXFfZXZfc2V0X2Rlc3QoJmV2LCBjbGllbnQsIHBvcnRfY291bnQpOworCXNuZF9zZXFfZXZlbnRfb3V0cHV0KHNlcSwgJmV2KTsKK30KKworc3RhdGljIHZvaWQgbWV0cm9ub21lX3BhdHRlcm4odW5zaWduZWQgaW50IHRpY2spCit7CisJaW50IGosIHQsIGR1cmF0aW9uOworCisJdCA9IHRpY2s7CisJZHVyYXRpb24gPSB0aWNrcyAqIDQgLyB0c19kaXY7CisJZm9yIChqID0gMDsgaiA8IHRzX251bTsgaisrKSB7CisJCW1ldHJvbm9tZV9ub3RlKGogPyBtZXRyb25vbWVfd2Vha19ub3RlIDogbWV0cm9ub21lX3N0cm9uZ19ub3RlLCB0KTsKKwkJdCArPSBkdXJhdGlvbjsKKwl9CisJbWV0cm9ub21lX2VjaG8odCk7CisJc25kX3NlcV9kcmFpbl9vdXRwdXQoc2VxKTsKK30KKworc3RhdGljIHZvaWQgbWV0cm9ub21lX3NldF9wcm9ncmFtKHZvaWQpCit7CisJc25kX3NlcV9ldmVudF90IGV2OworCisJc25kX3NlcV9ldl9jbGVhcigmZXYpOworCXNuZF9zZXFfZXZfc2V0X3BnbWNoYW5nZSgmZXYsIG1ldHJvbm9tZV9jaGFubmVsLCBtZXRyb25vbWVfcHJvZ3JhbSk7CisJc25kX3NlcV9ldl9zZXRfc291cmNlKCZldiwgcG9ydF9jb3VudCk7CisJc25kX3NlcV9ldl9zZXRfc3VicygmZXYpOworCXNuZF9zZXFfZXZlbnRfb3V0cHV0KHNlcSwgJmV2KTsKK30KKworc3RhdGljIHZvaWQgaW5pdF90cmFja3Modm9pZCkKK3sKKwlpbnQgaTsKKworCS8qIE1JREkgUlAtMDE5IHNheXMgd2UgbmVlZCBhdCBsZWFzdCBvbmUgdHJhY2sgcGVyIHBvcnQgKi8KKwludW1fdHJhY2tzID0gcG9ydF9jb3VudDsKKwkvKiBBbGxvY2F0ZSBvbmUgdHJhY2sgZm9yIGVhY2ggcG9zc2libGUgY2hhbm5lbC4KKwkgKiBFbXB0eSB0cmFja3Mgd29uJ3QgYmUgd3JpdHRlbiB0byB0aGUgZmlsZS4gKi8KKwlpZiAoY2hhbm5lbF9zcGxpdCkKKwkJbnVtX3RyYWNrcyAqPSBUUkFDS1NfUEVSX1BPUlQ7CisKKwl0cmFja3MgPSBjYWxsb2MobnVtX3RyYWNrcywgc2l6ZW9mKHN0cnVjdCBzbWZfdHJhY2spKTsKKwljaGVja19tZW0odHJhY2tzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3RyYWNrczsgKytpKQorCQl0cmFja3NbaV0uY3VyX2J1ZiA9ICZ0cmFja3NbaV0uZmlyc3RfYnVmOworfQorCitzdGF0aWMgdm9pZCBjcmVhdGVfcXVldWUodm9pZCkKK3sKKwlzbmRfc2VxX3F1ZXVlX3RlbXBvX3QgKnRlbXBvOworCWludCBlcnI7CisKKwlxdWV1ZSA9IHNuZF9zZXFfYWxsb2NfbmFtZWRfcXVldWUoc2VxLCAiYXJlY29yZG1pZGkiKTsKKwljaGVja19zbmQoImNyZWF0ZSBxdWV1ZSIsIHF1ZXVlKTsKKworCXNuZF9zZXFfcXVldWVfdGVtcG9fYWxsb2NhKCZ0ZW1wbyk7CisJaWYgKCFzbXB0ZV90aW1pbmcpIHsKKwkJc25kX3NlcV9xdWV1ZV90ZW1wb19zZXRfdGVtcG8odGVtcG8sIDYwMDAwMDAwIC8gYmVhdHMpOworCQlzbmRfc2VxX3F1ZXVlX3RlbXBvX3NldF9wcHEodGVtcG8sIHRpY2tzKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBBTFNBIGRvZXNuJ3Qga25vdyBhYm91dCB0aGUgU01QVEUgdGltZSBkaXZpc2lvbnMsIHNvCisJCSAqIHdlIHByZXRlbmQgdG8gaGF2ZSBhIG11c2ljYWwgdGVtcG8gd2l0aCB0aGUgZXF1aXZhbGVudAorCQkgKiBudW1iZXIgb2YgdGlja3Mvcy4KKwkJICovCisJCXN3aXRjaCAoZnJhbWVzKSB7CisJCWNhc2UgMjQ6CisJCQlzbmRfc2VxX3F1ZXVlX3RlbXBvX3NldF90ZW1wbyh0ZW1wbywgNTAwMDAwKTsKKwkJCXNuZF9zZXFfcXVldWVfdGVtcG9fc2V0X3BwcSh0ZW1wbywgMTIgKiB0aWNrcyk7CisJCQlicmVhazsKKwkJY2FzZSAyNToKKwkJCXNuZF9zZXFfcXVldWVfdGVtcG9fc2V0X3RlbXBvKHRlbXBvLCA0MDAwMDApOworCQkJc25kX3NlcV9xdWV1ZV90ZW1wb19zZXRfcHBxKHRlbXBvLCAxMCAqIHRpY2tzKTsKKwkJCWJyZWFrOworCQljYXNlIDI5OgorCQkJc25kX3NlcV9xdWV1ZV90ZW1wb19zZXRfdGVtcG8odGVtcG8sIDEwMDAwMDAwMCk7CisJCQlzbmRfc2VxX3F1ZXVlX3RlbXBvX3NldF9wcHEodGVtcG8sIDI5OTcgKiB0aWNrcyk7CisJCQlicmVhazsKKwkJY2FzZSAzMDoKKwkJCXNuZF9zZXFfcXVldWVfdGVtcG9fc2V0X3RlbXBvKHRlbXBvLCA1MDAwMDApOworCQkJc25kX3NlcV9xdWV1ZV90ZW1wb19zZXRfcHBxKHRlbXBvLCAxNSAqIHRpY2tzKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZmF0YWwoIkludmFsaWQgU01QVEUgZnJhbWVzICVkIiwgZnJhbWVzKTsKKwkJfQorCX0KKwllcnIgPSBzbmRfc2VxX3NldF9xdWV1ZV90ZW1wbyhzZXEsIHF1ZXVlLCB0ZW1wbyk7CisJaWYgKGVyciA8IDApCisJCWZhdGFsKCJDYW5ub3Qgc2V0IHF1ZXVlIHRlbXBvICgldS8laSkiLAorCQkgICAgICBzbmRfc2VxX3F1ZXVlX3RlbXBvX2dldF90ZW1wbyh0ZW1wbyksCisJCSAgICAgIHNuZF9zZXFfcXVldWVfdGVtcG9fZ2V0X3BwcSh0ZW1wbykpOworfQorCitzdGF0aWMgdm9pZCBjcmVhdGVfcG9ydHModm9pZCkKK3sKKwlzbmRfc2VxX3BvcnRfaW5mb190ICpwaW5mbzsKKwlpbnQgaSwgZXJyOworCWNoYXIgbmFtZVszMl07CisKKwlzbmRfc2VxX3BvcnRfaW5mb19hbGxvY2EoJnBpbmZvKTsKKworCS8qIGNvbW1vbiBpbmZvcm1hdGlvbiBmb3IgYWxsIG91ciBwb3J0cyAqLworCXNuZF9zZXFfcG9ydF9pbmZvX3NldF9jYXBhYmlsaXR5KHBpbmZvLAorCQkJCQkgU05EX1NFUV9QT1JUX0NBUF9XUklURSB8CisJCQkJCSBTTkRfU0VRX1BPUlRfQ0FQX1NVQlNfV1JJVEUpOworCXNuZF9zZXFfcG9ydF9pbmZvX3NldF90eXBlKHBpbmZvLAorCQkJCSAgIFNORF9TRVFfUE9SVF9UWVBFX01JRElfR0VORVJJQyB8CisJCQkJICAgU05EX1NFUV9QT1JUX1RZUEVfQVBQTElDQVRJT04pOworCXNuZF9zZXFfcG9ydF9pbmZvX3NldF9taWRpX2NoYW5uZWxzKHBpbmZvLCAxNik7CisKKwkvKiB3ZSB3YW50IHRvIGtub3cgd2hlbiB0aGUgZXZlbnRzIGdvdCBkZWxpdmVyZWQgdG8gdXMgKi8KKwlzbmRfc2VxX3BvcnRfaW5mb19zZXRfdGltZXN0YW1waW5nKHBpbmZvLCAxKTsKKwlzbmRfc2VxX3BvcnRfaW5mb19zZXRfdGltZXN0YW1wX3F1ZXVlKHBpbmZvLCBxdWV1ZSk7CisKKwkvKiBvdXIgcG9ydCBudW1iZXIgaXMgdGhlIHNhbWUgYXMgb3VyIHBvcnQgaW5kZXggKi8KKwlzbmRfc2VxX3BvcnRfaW5mb19zZXRfcG9ydF9zcGVjaWZpZWQocGluZm8sIDEpOworCWZvciAoaSA9IDA7IGkgPCBwb3J0X2NvdW50OyArK2kpIHsKKwkJc25kX3NlcV9wb3J0X2luZm9fc2V0X3BvcnQocGluZm8sIGkpOworCisJCXNwcmludGYobmFtZSwgImFyZWNvcmRtaWRpIHBvcnQgJWkiLCBpKTsKKwkJc25kX3NlcV9wb3J0X2luZm9fc2V0X25hbWUocGluZm8sIG5hbWUpOworCisJCWVyciA9IHNuZF9zZXFfY3JlYXRlX3BvcnQoc2VxLCBwaW5mbyk7CisJCWNoZWNrX3NuZCgiY3JlYXRlIHBvcnQiLCBlcnIpOworCX0KKworCS8qIGNyZWF0ZSBhbiBvcHRpb25hbCBtZXRyb25vbWUgcG9ydCAqLworCWlmICh1c2VfbWV0cm9ub21lKSB7CisJCXNuZF9zZXFfcG9ydF9pbmZvX3NldF9wb3J0KHBpbmZvLCBwb3J0X2NvdW50KTsKKwkJc25kX3NlcV9wb3J0X2luZm9fc2V0X25hbWUocGluZm8sICJhcmVjb3JkbWlkaSBtZXRyb25vbWUiKTsKKwkJc25kX3NlcV9wb3J0X2luZm9fc2V0X2NhcGFiaWxpdHkocGluZm8sCisJCQkJCQkgU05EX1NFUV9QT1JUX0NBUF9SRUFEIHwKKwkJCQkJCSBTTkRfU0VRX1BPUlRfQ0FQX1dSSVRFKTsKKwkJc25kX3NlcV9wb3J0X2luZm9fc2V0X3R5cGUocGluZm8sIFNORF9TRVFfUE9SVF9UWVBFX0FQUExJQ0FUSU9OKTsKKwkJc25kX3NlcV9wb3J0X2luZm9fc2V0X21pZGlfY2hhbm5lbHMocGluZm8sIDApOworCQlzbmRfc2VxX3BvcnRfaW5mb19zZXRfdGltZXN0YW1waW5nKHBpbmZvLCAwKTsKKwkJZXJyID0gc25kX3NlcV9jcmVhdGVfcG9ydChzZXEsIHBpbmZvKTsKKwkJY2hlY2tfc25kKCJjcmVhdGUgbWV0cm9ub21lIHBvcnQiLCBlcnIpOworCX0KK30KKworc3RhdGljIHZvaWQgY29ubmVjdF9wb3J0cyh2b2lkKQoreworCWludCBpLCBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDwgcG9ydF9jb3VudDsgKytpKSB7CisJCWVyciA9IHNuZF9zZXFfY29ubmVjdF9mcm9tKHNlcSwgaSwgcG9ydHNbaV0uY2xpZW50LCBwb3J0c1tpXS5wb3J0KTsKKwkJaWYgKGVyciA8IDApCisJCQlmYXRhbCgiQ2Fubm90IGNvbm5lY3QgZnJvbSBwb3J0ICVkOiVkIC0gJXMiLAorCQkJICAgICAgcG9ydHNbaV0uY2xpZW50LCBwb3J0c1tpXS5wb3J0LCBzbmRfc3RyZXJyb3IoZXJyKSk7CisJfQorCisJLyogc3Vic2NyaWJlIHRoZSBtZXRyb25vbWUgcG9ydCAqLworCWlmICh1c2VfbWV0cm9ub21lKSB7CisJICAgICAgICBlcnIgPSBzbmRfc2VxX2Nvbm5lY3RfdG8oc2VxLCBwb3J0X2NvdW50LCBtZXRyb25vbWVfcG9ydC5jbGllbnQsIG1ldHJvbm9tZV9wb3J0LnBvcnQpOworCQlpZiAoZXJyIDwgMCkKKwkgICAgCQlmYXRhbCgiQ2Fubm90IGNvbm5lY3QgdG8gcG9ydCAlZDolZCAtICVzIiwKKwkJCSAgICAgIG1ldHJvbm9tZV9wb3J0LmNsaWVudCwgbWV0cm9ub21lX3BvcnQucG9ydCwgc25kX3N0cmVycm9yKGVycikpOworCX0KK30KKworLyogcmVjb3JkcyBhIGJ5dGUgdG8gYmUgd3JpdHRlbiB0byB0aGUgLm1pZCBmaWxlICovCitzdGF0aWMgdm9pZCBhZGRfYnl0ZShzdHJ1Y3Qgc21mX3RyYWNrICp0cmFjaywgdW5zaWduZWQgY2hhciBieXRlKQoreworCS8qIG1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCByb29tIGluIHRoZSBjdXJyZW50IGJ1ZmZlciAqLworCWlmICh0cmFjay0+Y3VyX2J1Zl9zaXplID49IEJVRkZFUl9TSVpFKSB7CisJCXRyYWNrLT5jdXJfYnVmLT5uZXh0ID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgYnVmZmVyKSk7CisJCWlmICghdHJhY2stPmN1cl9idWYtPm5leHQpCisJCQlmYXRhbCgib3V0IG9mIG1lbW9yeSIpOworCQl0cmFjay0+Y3VyX2J1ZiA9IHRyYWNrLT5jdXJfYnVmLT5uZXh0OworCQl0cmFjay0+Y3VyX2J1Zl9zaXplID0gMDsKKwl9CisKKwl0cmFjay0+Y3VyX2J1Zi0+YnVmW3RyYWNrLT5jdXJfYnVmX3NpemUrK10gPSBieXRlOworCXRyYWNrLT5zaXplKys7Cit9CisKKy8qIHJlY29yZCBhIHZhcmlhYmxlLWxlbmd0aCBxdWFudGl0eSAqLworc3RhdGljIHZvaWQgdmFyX3ZhbHVlKHN0cnVjdCBzbWZfdHJhY2sgKnRyYWNrLCBpbnQgdikKK3sKKwlpZiAodiA+PSAoMSA8PCAyOCkpCisJCWFkZF9ieXRlKHRyYWNrLCAweDgwIHwgKCh2ID4+IDI4KSAmIDB4MDMpKTsKKwlpZiAodiA+PSAoMSA8PCAyMSkpCisJCWFkZF9ieXRlKHRyYWNrLCAweDgwIHwgKCh2ID4+IDIxKSAmIDB4N2YpKTsKKwlpZiAodiA+PSAoMSA8PCAxNCkpCisJCWFkZF9ieXRlKHRyYWNrLCAweDgwIHwgKCh2ID4+IDE0KSAmIDB4N2YpKTsKKwlpZiAodiA+PSAoMSA8PCA3KSkKKwkJYWRkX2J5dGUodHJhY2ssIDB4ODAgfCAoKHYgPj4gNykgJiAweDdmKSk7CisJYWRkX2J5dGUodHJhY2ssIHYgJiAweDdmKTsKK30KKworLyogcmVjb3JkIHRoZSBkZWx0YSB0aW1lIGZyb20gdGhlIGxhc3QgZXZlbnQgKi8KK3N0YXRpYyB2b2lkIGRlbHRhX3RpbWUoc3RydWN0IHNtZl90cmFjayAqdHJhY2ssIGNvbnN0IHNuZF9zZXFfZXZlbnRfdCAqZXYpCit7CisJaW50IGRpZmYgPSBldi0+dGltZS50aWNrIC0gdHJhY2stPmxhc3RfdGljazsKKwlpZiAoZGlmZiA8IDApCisJCWRpZmYgPSAwOworCXZhcl92YWx1ZSh0cmFjaywgZGlmZik7CisJdHJhY2stPmxhc3RfdGljayA9IGV2LT50aW1lLnRpY2s7Cit9CisKKy8qIHJlY29yZCBhIHN0YXR1cyBieXRlIChvciBub3QgaWYgd2UgY2FuIHVzZSBydW5uaW5nIHN0YXR1cykgKi8KK3N0YXRpYyB2b2lkIGNvbW1hbmQoc3RydWN0IHNtZl90cmFjayAqdHJhY2ssIHVuc2lnbmVkIGNoYXIgY21kKQoreworCWlmIChjbWQgIT0gdHJhY2stPmxhc3RfY29tbWFuZCkKKwkJYWRkX2J5dGUodHJhY2ssIGNtZCk7CisJdHJhY2stPmxhc3RfY29tbWFuZCA9IGNtZCA8IDB4ZjAgPyBjbWQgOiAwOworfQorCisvKiBwdXQgcG9ydCBudW1iZXJzIGludG8gYWxsIHRyYWNrcyAqLworc3RhdGljIHZvaWQgcmVjb3JkX3BvcnRfbnVtYmVycyh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG51bV90cmFja3M7ICsraSkgeworCQl2YXJfdmFsdWUoJnRyYWNrc1tpXSwgMCk7CisJCWFkZF9ieXRlKCZ0cmFja3NbaV0sIDB4ZmYpOworCQlhZGRfYnl0ZSgmdHJhY2tzW2ldLCAweDIxKTsKKwkJdmFyX3ZhbHVlKCZ0cmFja3NbaV0sIDEpOworCQlpZiAoY2hhbm5lbF9zcGxpdCkKKwkJCWFkZF9ieXRlKCZ0cmFja3NbaV0sIGkgLyBUUkFDS1NfUEVSX1BPUlQpOworCQllbHNlCisJCQlhZGRfYnl0ZSgmdHJhY2tzW2ldLCBpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlY29yZF9ldmVudChjb25zdCBzbmRfc2VxX2V2ZW50X3QgKmV2KQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBzbWZfdHJhY2sgKnRyYWNrOworCisJLyogaWdub3JlIGV2ZW50cyB3aXRob3V0IHByb3BlciB0aW1lc3RhbXBzICovCisJaWYgKGV2LT5xdWV1ZSAhPSBxdWV1ZSB8fCAhc25kX3NlcV9ldl9pc190aWNrKGV2KSkKKwkJcmV0dXJuOworCisJLyogZGV0ZXJtaW5lIHdoaWNoIHRyYWNrIHRvIHJlY29yZCB0byAqLworCWkgPSBldi0+ZGVzdC5wb3J0OworCWlmIChpID09IHBvcnRfY291bnQpIHsKKwkJaWYgKGV2LT50eXBlID09IFNORF9TRVFfRVZFTlRfVVNSMCkKKwkJCW1ldHJvbm9tZV9wYXR0ZXJuKGV2LT50aW1lLnRpY2spOworCQlyZXR1cm47CisJfQorCWlmIChjaGFubmVsX3NwbGl0KSB7CisJCWkgKj0gVFJBQ0tTX1BFUl9QT1JUOworCQlpZiAoc25kX3NlcV9ldl9pc19jaGFubmVsX3R5cGUoZXYpKQorCQkJaSArPSAxICsgKGV2LT5kYXRhLm5vdGUuY2hhbm5lbCAmIDB4Zik7CisJfQorCWlmIChpID49IG51bV90cmFja3MpCisJCXJldHVybjsKKwl0cmFjayA9ICZ0cmFja3NbaV07CisKKwlzd2l0Y2ggKGV2LT50eXBlKSB7CisJY2FzZSBTTkRfU0VRX0VWRU5UX05PVEVPTjoKKwkJZGVsdGFfdGltZSh0cmFjaywgZXYpOworCQljb21tYW5kKHRyYWNrLCBNSURJX0NNRF9OT1RFX09OIHwgKGV2LT5kYXRhLm5vdGUuY2hhbm5lbCAmIDB4ZikpOworCQlhZGRfYnl0ZSh0cmFjaywgZXYtPmRhdGEubm90ZS5ub3RlICYgMHg3Zik7CisJCWFkZF9ieXRlKHRyYWNrLCBldi0+ZGF0YS5ub3RlLnZlbG9jaXR5ICYgMHg3Zik7CisJCWJyZWFrOworCWNhc2UgU05EX1NFUV9FVkVOVF9OT1RFT0ZGOgorCQlkZWx0YV90aW1lKHRyYWNrLCBldik7CisJCWNvbW1hbmQodHJhY2ssIE1JRElfQ01EX05PVEVfT0ZGIHwgKGV2LT5kYXRhLm5vdGUuY2hhbm5lbCAmIDB4ZikpOworCQlhZGRfYnl0ZSh0cmFjaywgZXYtPmRhdGEubm90ZS5ub3RlICYgMHg3Zik7CisJCWFkZF9ieXRlKHRyYWNrLCBldi0+ZGF0YS5ub3RlLnZlbG9jaXR5ICYgMHg3Zik7CisJCWJyZWFrOworCWNhc2UgU05EX1NFUV9FVkVOVF9LRVlQUkVTUzoKKwkJZGVsdGFfdGltZSh0cmFjaywgZXYpOworCQljb21tYW5kKHRyYWNrLCBNSURJX0NNRF9OT1RFX1BSRVNTVVJFIHwgKGV2LT5kYXRhLm5vdGUuY2hhbm5lbCAmIDB4ZikpOworCQlhZGRfYnl0ZSh0cmFjaywgZXYtPmRhdGEubm90ZS5ub3RlICYgMHg3Zik7CisJCWFkZF9ieXRlKHRyYWNrLCBldi0+ZGF0YS5ub3RlLnZlbG9jaXR5ICYgMHg3Zik7CisJCWJyZWFrOworCWNhc2UgU05EX1NFUV9FVkVOVF9DT05UUk9MTEVSOgorCQlkZWx0YV90aW1lKHRyYWNrLCBldik7CisJCWNvbW1hbmQodHJhY2ssIE1JRElfQ01EX0NPTlRST0wgfCAoZXYtPmRhdGEuY29udHJvbC5jaGFubmVsICYgMHhmKSk7CisJCWFkZF9ieXRlKHRyYWNrLCBldi0+ZGF0YS5jb250cm9sLnBhcmFtICYgMHg3Zik7CisJCWFkZF9ieXRlKHRyYWNrLCBldi0+ZGF0YS5jb250cm9sLnZhbHVlICYgMHg3Zik7CisJCWJyZWFrOworCWNhc2UgU05EX1NFUV9FVkVOVF9QR01DSEFOR0U6CisJCWRlbHRhX3RpbWUodHJhY2ssIGV2KTsKKwkJY29tbWFuZCh0cmFjaywgTUlESV9DTURfUEdNX0NIQU5HRSB8IChldi0+ZGF0YS5jb250cm9sLmNoYW5uZWwgJiAweGYpKTsKKwkJYWRkX2J5dGUodHJhY2ssIGV2LT5kYXRhLmNvbnRyb2wudmFsdWUgJiAweDdmKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU0VRX0VWRU5UX0NIQU5QUkVTUzoKKwkJZGVsdGFfdGltZSh0cmFjaywgZXYpOworCQljb21tYW5kKHRyYWNrLCBNSURJX0NNRF9DSEFOTkVMX1BSRVNTVVJFIHwgKGV2LT5kYXRhLmNvbnRyb2wuY2hhbm5lbCAmIDB4ZikpOworCQlhZGRfYnl0ZSh0cmFjaywgZXYtPmRhdGEuY29udHJvbC52YWx1ZSAmIDB4N2YpOworCQlicmVhazsKKwljYXNlIFNORF9TRVFfRVZFTlRfUElUQ0hCRU5EOgorCQlkZWx0YV90aW1lKHRyYWNrLCBldik7CisJCWNvbW1hbmQodHJhY2ssIE1JRElfQ01EX0JFTkRFUiB8IChldi0+ZGF0YS5jb250cm9sLmNoYW5uZWwgJiAweGYpKTsKKwkJYWRkX2J5dGUodHJhY2ssIChldi0+ZGF0YS5jb250cm9sLnZhbHVlICsgODE5MikgJiAweDdmKTsKKwkJYWRkX2J5dGUodHJhY2ssICgoZXYtPmRhdGEuY29udHJvbC52YWx1ZSArIDgxOTIpID4+IDcpICYgMHg3Zik7CisJCWJyZWFrOworCWNhc2UgU05EX1NFUV9FVkVOVF9DT05UUk9MMTQ6CisJCS8qIGNyZWF0ZSB0d28gY29tbWFuZHMgZm9yIE1TQiBhbmQgTFNCICovCisJCWRlbHRhX3RpbWUodHJhY2ssIGV2KTsKKwkJY29tbWFuZCh0cmFjaywgTUlESV9DTURfQ09OVFJPTCB8IChldi0+ZGF0YS5jb250cm9sLmNoYW5uZWwgJiAweGYpKTsKKwkJYWRkX2J5dGUodHJhY2ssIGV2LT5kYXRhLmNvbnRyb2wucGFyYW0gJiAweDdmKTsKKwkJYWRkX2J5dGUodHJhY2ssIChldi0+ZGF0YS5jb250cm9sLnZhbHVlID4+IDcpICYgMHg3Zik7CisJCWlmICgoZXYtPmRhdGEuY29udHJvbC5wYXJhbSAmIDB4N2YpIDwgMHgyMCkgeworCQkJZGVsdGFfdGltZSh0cmFjaywgZXYpOworCQkJLyogcnVubmluZyBzdGF0dXMgKi8KKwkJCWFkZF9ieXRlKHRyYWNrLCAoZXYtPmRhdGEuY29udHJvbC5wYXJhbSAmIDB4N2YpICsgMHgyMCk7CisJCQlhZGRfYnl0ZSh0cmFjaywgZXYtPmRhdGEuY29udHJvbC52YWx1ZSAmIDB4N2YpOworCQl9CisJCWJyZWFrOworCWNhc2UgU05EX1NFUV9FVkVOVF9OT05SRUdQQVJBTToKKwkJZGVsdGFfdGltZSh0cmFjaywgZXYpOworCQljb21tYW5kKHRyYWNrLCBNSURJX0NNRF9DT05UUk9MIHwgKGV2LT5kYXRhLmNvbnRyb2wuY2hhbm5lbCAmIDB4ZikpOworCQlhZGRfYnl0ZSh0cmFjaywgTUlESV9DVExfTk9OUkVHX1BBUk1fTlVNX0xTQik7CisJCWFkZF9ieXRlKHRyYWNrLCBldi0+ZGF0YS5jb250cm9sLnBhcmFtICYgMHg3Zik7CisJCWRlbHRhX3RpbWUodHJhY2ssIGV2KTsKKwkJYWRkX2J5dGUodHJhY2ssIE1JRElfQ1RMX05PTlJFR19QQVJNX05VTV9NU0IpOworCQlhZGRfYnl0ZSh0cmFjaywgKGV2LT5kYXRhLmNvbnRyb2wucGFyYW0gPj4gNykgJiAweDdmKTsKKwkJZGVsdGFfdGltZSh0cmFjaywgZXYpOworCQlhZGRfYnl0ZSh0cmFjaywgTUlESV9DVExfTVNCX0RBVEFfRU5UUlkpOworCQlhZGRfYnl0ZSh0cmFjaywgKGV2LT5kYXRhLmNvbnRyb2wudmFsdWUgPj4gNykgJiAweDdmKTsKKwkJZGVsdGFfdGltZSh0cmFjaywgZXYpOworCQlhZGRfYnl0ZSh0cmFjaywgTUlESV9DVExfTFNCX0RBVEFfRU5UUlkpOworCQlhZGRfYnl0ZSh0cmFjaywgZXYtPmRhdGEuY29udHJvbC52YWx1ZSAmIDB4N2YpOworCQlicmVhazsKKwljYXNlIFNORF9TRVFfRVZFTlRfUkVHUEFSQU06CisJCWRlbHRhX3RpbWUodHJhY2ssIGV2KTsKKwkJY29tbWFuZCh0cmFjaywgTUlESV9DTURfQ09OVFJPTCB8IChldi0+ZGF0YS5jb250cm9sLmNoYW5uZWwgJiAweGYpKTsKKwkJYWRkX2J5dGUodHJhY2ssIE1JRElfQ1RMX1JFR0lTVF9QQVJNX05VTV9MU0IpOworCQlhZGRfYnl0ZSh0cmFjaywgZXYtPmRhdGEuY29udHJvbC5wYXJhbSAmIDB4N2YpOworCQlkZWx0YV90aW1lKHRyYWNrLCBldik7CisJCWFkZF9ieXRlKHRyYWNrLCBNSURJX0NUTF9SRUdJU1RfUEFSTV9OVU1fTVNCKTsKKwkJYWRkX2J5dGUodHJhY2ssIChldi0+ZGF0YS5jb250cm9sLnBhcmFtID4+IDcpICYgMHg3Zik7CisJCWRlbHRhX3RpbWUodHJhY2ssIGV2KTsKKwkJYWRkX2J5dGUodHJhY2ssIE1JRElfQ1RMX01TQl9EQVRBX0VOVFJZKTsKKwkJYWRkX2J5dGUodHJhY2ssIChldi0+ZGF0YS5jb250cm9sLnZhbHVlID4+IDcpICYgMHg3Zik7CisJCWRlbHRhX3RpbWUodHJhY2ssIGV2KTsKKwkJYWRkX2J5dGUodHJhY2ssIE1JRElfQ1RMX0xTQl9EQVRBX0VOVFJZKTsKKwkJYWRkX2J5dGUodHJhY2ssIGV2LT5kYXRhLmNvbnRyb2wudmFsdWUgJiAweDdmKTsKKwkJYnJlYWs7CisjaWYgMAkvKiBpZ25vcmUgKi8KKwljYXNlIFNORF9TRVFfRVZFTlRfU09OR1BPUzoKKwljYXNlIFNORF9TRVFfRVZFTlRfU09OR1NFTDoKKwljYXNlIFNORF9TRVFfRVZFTlRfUUZSQU1FOgorCWNhc2UgU05EX1NFUV9FVkVOVF9TVEFSVDoKKwljYXNlIFNORF9TRVFfRVZFTlRfQ09OVElOVUU6CisJY2FzZSBTTkRfU0VRX0VWRU5UX1NUT1A6CisJY2FzZSBTTkRfU0VRX0VWRU5UX1RVTkVfUkVRVUVTVDoKKwljYXNlIFNORF9TRVFfRVZFTlRfUkVTRVQ6CisJY2FzZSBTTkRfU0VRX0VWRU5UX1NFTlNJTkc6CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBTTkRfU0VRX0VWRU5UX1NZU0VYOgorCQlpZiAoZXYtPmRhdGEuZXh0LmxlbiA9PSAwKQorCQkJYnJlYWs7CisJCWRlbHRhX3RpbWUodHJhY2ssIGV2KTsKKwkJaWYgKCoodW5zaWduZWQgY2hhciopZXYtPmRhdGEuZXh0LnB0ciA9PSAweGYwKQorCQkJY29tbWFuZCh0cmFjaywgMHhmMCksIGkgPSAxOworCQllbHNlCisJCQljb21tYW5kKHRyYWNrLCAweGY3KSwgaSA9IDA7CisJCXZhcl92YWx1ZSh0cmFjaywgZXYtPmRhdGEuZXh0LmxlbiAtIGkpOworCQlmb3IgKDsgaSA8IGV2LT5kYXRhLmV4dC5sZW47ICsraSkKKwkJCWFkZF9ieXRlKHRyYWNrLCAoKHVuc2lnbmVkIGNoYXIqKWV2LT5kYXRhLmV4dC5wdHIpW2ldKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKwl0cmFjay0+dXNlZCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmlzaF90cmFja3Modm9pZCkKK3sKKwlzbmRfc2VxX3F1ZXVlX3N0YXR1c190ICpxdWV1ZV9zdGF0dXM7CisJaW50IHRpY2ssIGksIGVycjsKKworCXNuZF9zZXFfcXVldWVfc3RhdHVzX2FsbG9jYSgmcXVldWVfc3RhdHVzKTsKKworCWVyciA9IHNuZF9zZXFfZ2V0X3F1ZXVlX3N0YXR1cyhzZXEsIHF1ZXVlLCBxdWV1ZV9zdGF0dXMpOworCWNoZWNrX3NuZCgiZ2V0IHF1ZXVlIHN0YXR1cyIsIGVycik7CisJdGljayA9IHNuZF9zZXFfcXVldWVfc3RhdHVzX2dldF90aWNrX3RpbWUocXVldWVfc3RhdHVzKTsKKworCS8qIG1ha2UgbGVuZ3RoIG9mIGZpcnN0IHRyYWNrIHRoZSByZWNvcmRpbmcgbGVuZ3RoICovCisJdmFyX3ZhbHVlKCZ0cmFja3NbMF0sIHRpY2sgLSB0cmFja3NbMF0ubGFzdF90aWNrKTsKKwlhZGRfYnl0ZSgmdHJhY2tzWzBdLCAweGZmKTsKKwlhZGRfYnl0ZSgmdHJhY2tzWzBdLCAweDJmKTsKKwl2YXJfdmFsdWUoJnRyYWNrc1swXSwgMCk7CisKKwkvKiBmaW5pc2ggb3RoZXIgdHJhY2tzICovCisJZm9yIChpID0gMTsgaSA8IG51bV90cmFja3M7ICsraSkgeworCQl2YXJfdmFsdWUoJnRyYWNrc1tpXSwgMCk7CisJCWFkZF9ieXRlKCZ0cmFja3NbaV0sIDB4ZmYpOworCQlhZGRfYnl0ZSgmdHJhY2tzW2ldLCAweDJmKTsKKwkJdmFyX3ZhbHVlKCZ0cmFja3NbaV0sIDApOworCX0KK30KKworc3RhdGljIHZvaWQgd3JpdGVfZmlsZSh2b2lkKQoreworCWludCB1c2VkX3RyYWNrcywgdGltZV9kaXZpc2lvbiwgaTsKKwlzdHJ1Y3QgYnVmZmVyICpidWY7CisKKwl1c2VkX3RyYWNrcyA9IDA7CisJZm9yIChpID0gMDsgaSA8IG51bV90cmFja3M7ICsraSkKKwkJdXNlZF90cmFja3MgKz0gISF0cmFja3NbaV0udXNlZDsKKworCS8qIGhlYWRlciBpZCBhbmQgbGVuZ3RoICovCisJZndyaXRlKCJNVGhkXDBcMFwwXDYiLCAxLCA4LCBmaWxlKTsKKwkvKiB0eXBlIDAgb3IgMSAqLworCWZwdXRjKDAsIGZpbGUpOworCWZwdXRjKHVzZWRfdHJhY2tzID4gMSwgZmlsZSk7CisJLyogbnVtYmVyIG9mIHRyYWNrcyAqLworCWZwdXRjKCh1c2VkX3RyYWNrcyA+PiA4KSAmIDB4ZmYsIGZpbGUpOworCWZwdXRjKHVzZWRfdHJhY2tzICYgMHhmZiwgZmlsZSk7CisJLyogdGltZSBkaXZpc2lvbiAqLworCXRpbWVfZGl2aXNpb24gPSB0aWNrczsKKwlpZiAoc21wdGVfdGltaW5nKQorCQl0aW1lX2RpdmlzaW9uIHw9ICgweDEwMCAtIGZyYW1lcykgPDwgODsKKwlmcHV0Yyh0aW1lX2RpdmlzaW9uID4+IDgsIGZpbGUpOworCWZwdXRjKHRpbWVfZGl2aXNpb24gJiAweGZmLCBmaWxlKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fdHJhY2tzOyArK2kpIHsKKwkJaWYgKCF0cmFja3NbaV0udXNlZCkKKwkJCWNvbnRpbnVlOworCQkvKiB0cmFjayBpZCAqLworCQlmd3JpdGUoIk1UcmsiLCAxLCA0LCBmaWxlKTsKKwkJLyogZGF0YSBsZW5ndGggKi8KKwkJZnB1dGMoKHRyYWNrc1tpXS5zaXplID4+IDI0KSAmIDB4ZmYsIGZpbGUpOworCQlmcHV0YygodHJhY2tzW2ldLnNpemUgPj4gMTYpICYgMHhmZiwgZmlsZSk7CisJCWZwdXRjKCh0cmFja3NbaV0uc2l6ZSA+PiA4KSAmIDB4ZmYsIGZpbGUpOworCQlmcHV0Yyh0cmFja3NbaV0uc2l6ZSAmIDB4ZmYsIGZpbGUpOworCQkvKiB0cmFjayBjb250ZW50cyAqLworCQlmb3IgKGJ1ZiA9ICZ0cmFja3NbaV0uZmlyc3RfYnVmOyBidWY7IGJ1ZiA9IGJ1Zi0+bmV4dCkKKwkJCWZ3cml0ZShidWYtPmJ1ZiwgMSwgYnVmID09IHRyYWNrc1tpXS5jdXJfYnVmCisJCQkgICAgICAgPyB0cmFja3NbaV0uY3VyX2J1Zl9zaXplIDogQlVGRkVSX1NJWkUsIGZpbGUpOworCX0KK30KKworc3RhdGljIHZvaWQgbGlzdF9wb3J0cyh2b2lkKQoreworCXNuZF9zZXFfY2xpZW50X2luZm9fdCAqY2luZm87CisJc25kX3NlcV9wb3J0X2luZm9fdCAqcGluZm87CisKKwlzbmRfc2VxX2NsaWVudF9pbmZvX2FsbG9jYSgmY2luZm8pOworCXNuZF9zZXFfcG9ydF9pbmZvX2FsbG9jYSgmcGluZm8pOworCisJcHV0cygiIFBvcnQgICAgQ2xpZW50IG5hbWUgICAgICAgICAgICAgICAgICAgICAgUG9ydCBuYW1lIik7CisKKwlzbmRfc2VxX2NsaWVudF9pbmZvX3NldF9jbGllbnQoY2luZm8sIC0xKTsKKwl3aGlsZSAoc25kX3NlcV9xdWVyeV9uZXh0X2NsaWVudChzZXEsIGNpbmZvKSA+PSAwKSB7CisJCWludCBjbGllbnQgPSBzbmRfc2VxX2NsaWVudF9pbmZvX2dldF9jbGllbnQoY2luZm8pOworCisJCWlmIChjbGllbnQgPT0gU05EX1NFUV9DTElFTlRfU1lTVEVNKQorCQkJY29udGludWU7IC8qIGRvbid0IHNob3cgc3lzdGVtIHRpbWVyIGFuZCBhbm5vdW5jZSBwb3J0cyAqLworCQlzbmRfc2VxX3BvcnRfaW5mb19zZXRfY2xpZW50KHBpbmZvLCBjbGllbnQpOworCQlzbmRfc2VxX3BvcnRfaW5mb19zZXRfcG9ydChwaW5mbywgLTEpOworCQl3aGlsZSAoc25kX3NlcV9xdWVyeV9uZXh0X3BvcnQoc2VxLCBwaW5mbykgPj0gMCkgeworCQkJLyogcG9ydCBtdXN0IHVuZGVyc3RhbmQgTUlESSBtZXNzYWdlcyAqLworCQkJaWYgKCEoc25kX3NlcV9wb3J0X2luZm9fZ2V0X3R5cGUocGluZm8pCisJCQkgICAgICAmIFNORF9TRVFfUE9SVF9UWVBFX01JRElfR0VORVJJQykpCisJCQkJY29udGludWU7CisJCQkvKiB3ZSBuZWVkIGJvdGggUkVBRCBhbmQgU1VCU19SRUFEICovCisJCQlpZiAoKHNuZF9zZXFfcG9ydF9pbmZvX2dldF9jYXBhYmlsaXR5KHBpbmZvKQorCQkJICAgICAmIChTTkRfU0VRX1BPUlRfQ0FQX1JFQUQgfCBTTkRfU0VRX1BPUlRfQ0FQX1NVQlNfUkVBRCkpCisJCQkgICAgIT0gKFNORF9TRVFfUE9SVF9DQVBfUkVBRCB8IFNORF9TRVFfUE9SVF9DQVBfU1VCU19SRUFEKSkKKwkJCQljb250aW51ZTsKKwkJCXByaW50ZigiJTNkOiUtM2QgICUtMzIuMzJzICVzXG4iLAorCQkJICAgICAgIHNuZF9zZXFfcG9ydF9pbmZvX2dldF9jbGllbnQocGluZm8pLAorCQkJICAgICAgIHNuZF9zZXFfcG9ydF9pbmZvX2dldF9wb3J0KHBpbmZvKSwKKwkJCSAgICAgICBzbmRfc2VxX2NsaWVudF9pbmZvX2dldF9uYW1lKGNpbmZvKSwKKwkJCSAgICAgICBzbmRfc2VxX3BvcnRfaW5mb19nZXRfbmFtZShwaW5mbykpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBoZWxwKGNvbnN0IGNoYXIgKmFyZ3YwKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFtvcHRpb25zXSBvdXRwdXRmaWxlXG4iCisJCSJcbkF2YWlsYWJsZSBvcHRpb25zOlxuIgorCQkiICAtaCwtLWhlbHAgICAgICAgICAgICAgICAgICB0aGlzIGhlbHBcbiIKKwkJIiAgLVYsLS12ZXJzaW9uICAgICAgICAgICAgICAgc2hvdyB2ZXJzaW9uXG4iCisJCSIgIC1sLC0tbGlzdCAgICAgICAgICAgICAgICAgIGxpc3QgaW5wdXQgcG9ydHNcbiIKKwkJIiAgLXAsLS1wb3J0PWNsaWVudDpwb3J0LC4uLiAgc291cmNlIHBvcnQocylcbiIKKwkJIiAgLWIsLS1icG09YmVhdHMgICAgICAgICAgICAgdGVtcG8gaW4gYmVhdHMgcGVyIG1pbnV0ZVxuIgorCQkiICAtZiwtLWZwcz1mcmFtZXMgICAgICAgICAgICByZXNvbHV0aW9uIGluIGZyYW1lcyBwZXIgc2Vjb25kIChTTVBURSlcbiIKKwkJIiAgLXQsLS10aWNrcz10aWNrcyAgICAgICAgICAgcmVzb2x1dGlvbiBpbiB0aWNrcyBwZXIgYmVhdCBvciBmcmFtZVxuIgorCQkiICAtcywtLXNwbGl0LWNoYW5uZWxzICAgICAgICBjcmVhdGUgYSB0cmFjayBmb3IgZWFjaCBjaGFubmVsXG4iCisJCSIgIC1tLC0tbWV0cm9ub21lPWNsaWVudDpwb3J0IHBsYXkgYSBtZXRyb25vbWUgc2lnbmFsXG4iCisJCSIgIC1pLC0tdGltZXNpZz1ubjpkZCAgICAgICAgIHRpbWUgc2lnbmF0dXJlXG4iLAorCQlhcmd2MCk7Cit9CisKK3N0YXRpYyB2b2lkIHZlcnNpb24odm9pZCkKK3sKKwlmcHV0cygiYXJlY29yZG1pZGkgdmVyc2lvbiAiIFNORF9VVElMX1ZFUlNJT05fU1RSICJcbiIsIHN0ZGVycik7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ2hhbmRsZXIoaW50IHNpZykKK3sKKwlzdG9wID0gMTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBzaG9ydF9vcHRpb25zW10gPSAiaFZscDpiOmY6dDpzZG06aToiOworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0geworCQl7ImhlbHAiLCAwLCBOVUxMLCAnaCd9LAorCQl7InZlcnNpb24iLCAwLCBOVUxMLCAnVid9LAorCQl7Imxpc3QiLCAwLCBOVUxMLCAnbCd9LAorCQl7InBvcnQiLCAxLCBOVUxMLCAncCd9LAorCQl7ImJwbSIsIDEsIE5VTEwsICdiJ30sCisJCXsiZnBzIiwgMSwgTlVMTCwgJ2YnfSwKKwkJeyJ0aWNrcyIsIDEsIE5VTEwsICd0J30sCisJCXsic3BsaXQtY2hhbm5lbHMiLCAwLCBOVUxMLCAncyd9LAorCQl7ImR1bXAiLCAwLCBOVUxMLCAnZCd9LAorCQl7Im1ldHJvbm9tZSIsIDEsIE5VTEwsICdtJ30sCisJCXsidGltZXNpZyIsIDEsIE5VTEwsICdpJ30sCisJCXsgfQorCX07CisKKwljaGFyICpmaWxlbmFtZSA9IE5VTEw7CisJaW50IGRvX2xpc3QgPSAwOworCXN0cnVjdCBwb2xsZmQgKnBmZHM7CisJaW50IG5wZmRzOworCWludCBjLCBlcnI7CisKKwlpbml0X3NlcSgpOworCisJd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgc2hvcnRfb3B0aW9ucywKKwkJCQlsb25nX29wdGlvbnMsIE5VTEwpKSAhPSAtMSkgeworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnaCc6CisJCQloZWxwKGFyZ3ZbMF0pOworCQkJcmV0dXJuIDA7CisJCWNhc2UgJ1YnOgorCQkJdmVyc2lvbigpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgJ2wnOgorCQkJZG9fbGlzdCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlwYXJzZV9wb3J0cyhvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ2InOgorCQkJYmVhdHMgPSBhdG9pKG9wdGFyZyk7CisJCQlpZiAoYmVhdHMgPCA0IHx8IGJlYXRzID4gNjAwMCkKKwkJCQlmYXRhbCgiSW52YWxpZCB0ZW1wbyIpOworCQkJc21wdGVfdGltaW5nID0gMDsKKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCWZyYW1lcyA9IGF0b2kob3B0YXJnKTsKKwkJCWlmIChmcmFtZXMgIT0gMjQgJiYgZnJhbWVzICE9IDI1ICYmCisJCQkgICAgZnJhbWVzICE9IDI5ICYmIGZyYW1lcyAhPSAzMCkKKwkJCQlmYXRhbCgiSW52YWxpZCBudW1iZXIgb2YgZnJhbWVzL3MiKTsKKwkJCXNtcHRlX3RpbWluZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQl0aWNrcyA9IGF0b2kob3B0YXJnKTsKKwkJCWlmICh0aWNrcyA8IDEgfHwgdGlja3MgPiAweDdmZmYpCisJCQkJZmF0YWwoIkludmFsaWQgbnVtYmVyIG9mIHRpY2tzIik7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQljaGFubmVsX3NwbGl0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCWZwdXRzKCJUaGUgLS1kdW1wIG9wdGlvbiBpc24ndCBzdXBwb3J0ZWQgYW55bW9yZSwgdXNlIGFzZXFkdW1wIGluc3RlYWQuXG4iLCBzdGRlcnIpOworCQkJYnJlYWs7CisJCWNhc2UgJ20nOgorCQkJaW5pdF9tZXRyb25vbWUob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdpJzoKKwkJCXRpbWVfc2lnbmF0dXJlKG9wdGFyZyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWhlbHAoYXJndlswXSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCWlmIChkb19saXN0KSB7CisJCWxpc3RfcG9ydHMoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHBvcnRfY291bnQgPCAxKSB7CisJCWZwdXRzKCJQbGVhc3Qgc3BlY2lmeSBhIHNvdXJjZSBwb3J0IHdpdGggLS1wb3J0LlxuIiwgc3RkZXJyKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCF0aWNrcykKKwkJdGlja3MgPSBzbXB0ZV90aW1pbmcgPyA0MCA6IDM4NDsKKwlpZiAoc21wdGVfdGltaW5nICYmIHRpY2tzID4gMHhmZikKKwkJdGlja3MgPSAweGZmOworCisJaWYgKG9wdGluZCA+PSBhcmdjKSB7CisJCWZwdXRzKCJQbGVhc2Ugc3BlY2lmeSBhIGZpbGUgdG8gcmVjb3JkIHRvLlxuIiwgc3RkZXJyKTsKKwkJcmV0dXJuIDE7CisJfQorCWZpbGVuYW1lID0gYXJndltvcHRpbmRdOworCisJaW5pdF90cmFja3MoKTsKKwljcmVhdGVfcXVldWUoKTsKKwljcmVhdGVfcG9ydHMoKTsKKwljb25uZWN0X3BvcnRzKCk7CisJaWYgKHBvcnRfY291bnQgPiAxKQorCQlyZWNvcmRfcG9ydF9udW1iZXJzKCk7CisKKwkvKiByZWNvcmQgdGVtcG8gKi8KKwlpZiAoIXNtcHRlX3RpbWluZykgeworCQlpbnQgdXNlY3NfcGVyX3F1YXJ0ZXIgPSA2MDAwMDAwMCAvIGJlYXRzOworCQl2YXJfdmFsdWUoJnRyYWNrc1swXSwgMCk7IC8qIGRlbHRhIHRpbWUgKi8KKwkJYWRkX2J5dGUoJnRyYWNrc1swXSwgMHhmZik7CisJCWFkZF9ieXRlKCZ0cmFja3NbMF0sIDB4NTEpOworCQl2YXJfdmFsdWUoJnRyYWNrc1swXSwgMyk7CisJCWFkZF9ieXRlKCZ0cmFja3NbMF0sIHVzZWNzX3Blcl9xdWFydGVyID4+IDE2KTsKKwkJYWRkX2J5dGUoJnRyYWNrc1swXSwgdXNlY3NfcGVyX3F1YXJ0ZXIgPj4gOCk7CisJCWFkZF9ieXRlKCZ0cmFja3NbMF0sIHVzZWNzX3Blcl9xdWFydGVyKTsKKworCQkvKiB0aW1lIHNpZ25hdHVyZSAqLworCQl2YXJfdmFsdWUoJnRyYWNrc1swXSwgMCk7IC8qIGRlbHRhIHRpbWUgKi8KKwkJYWRkX2J5dGUoJnRyYWNrc1swXSwgMHhmZik7CisJCWFkZF9ieXRlKCZ0cmFja3NbMF0sIDB4NTgpOworCQl2YXJfdmFsdWUoJnRyYWNrc1swXSwgNCk7CisJCWFkZF9ieXRlKCZ0cmFja3NbMF0sIHRzX251bSk7CisJCWFkZF9ieXRlKCZ0cmFja3NbMF0sIHRzX2RkKTsKKwkJYWRkX2J5dGUoJnRyYWNrc1swXSwgMjQpOyAvKiBNSURJIGNsb2NrcyBwZXIgbWV0cm9ub21lIGNsaWNrICovCisJCWFkZF9ieXRlKCZ0cmFja3NbMF0sIDgpOyAvKiBub3RhdGVkIDMybmQtbm90ZXMgcGVyIE1JREkgcXVhcnRlciBub3RlICovCisJfQorCQorCS8qIGFsd2F5cyB3cml0ZSBhdCBsZWFzdCBvbmUgdHJhY2sgKi8KKwl0cmFja3NbMF0udXNlZCA9IDE7CisKKwlmaWxlID0gZm9wZW4oZmlsZW5hbWUsICJ3YiIpOworCWlmICghZmlsZSkKKwkJZmF0YWwoIkNhbm5vdCBvcGVuICVzIC0gJXMiLCBmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKworCWVyciA9IHNuZF9zZXFfc3RhcnRfcXVldWUoc2VxLCBxdWV1ZSwgTlVMTCk7CisJY2hlY2tfc25kKCJzdGFydCBxdWV1ZSIsIGVycik7CisJc25kX3NlcV9kcmFpbl9vdXRwdXQoc2VxKTsKKworCWVyciA9IHNuZF9zZXFfbm9uYmxvY2soc2VxLCAxKTsKKwljaGVja19zbmQoInNldCBub25ibG9jayBtb2RlIiwgZXJyKTsKKwkKKwlpZiAodXNlX21ldHJvbm9tZSkgeworCQltZXRyb25vbWVfc2V0X3Byb2dyYW0oKTsKKwkJbWV0cm9ub21lX3BhdHRlcm4oMCk7CisJfQorCisJc2lnbmFsKFNJR0lOVCwgc2lnaGFuZGxlcik7CisJc2lnbmFsKFNJR1RFUk0sIHNpZ2hhbmRsZXIpOworCisJbnBmZHMgPSBzbmRfc2VxX3BvbGxfZGVzY3JpcHRvcnNfY291bnQoc2VxLCBQT0xMSU4pOworCXBmZHMgPSBhbGxvY2Eoc2l6ZW9mKCpwZmRzKSAqIG5wZmRzKTsKKwlmb3IgKDs7KSB7CisJCXNuZF9zZXFfcG9sbF9kZXNjcmlwdG9ycyhzZXEsIHBmZHMsIG5wZmRzLCBQT0xMSU4pOworCQlpZiAocG9sbChwZmRzLCBucGZkcywgLTEpIDwgMCkKKwkJCWJyZWFrOworCQlkbyB7CisJCQlzbmRfc2VxX2V2ZW50X3QgKmV2ZW50OworCQkJZXJyID0gc25kX3NlcV9ldmVudF9pbnB1dChzZXEsICZldmVudCk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlicmVhazsKKwkJCWlmIChldmVudCkKKwkJCQlyZWNvcmRfZXZlbnQoZXZlbnQpOworCQl9IHdoaWxlIChlcnIgPiAwKTsKKwkJaWYgKHN0b3ApCisJCQlicmVhazsKKwl9CisKKwlmaW5pc2hfdHJhY2tzKCk7CisJd3JpdGVfZmlsZSgpOworCisJZmNsb3NlKGZpbGUpOworCXNuZF9zZXFfY2xvc2Uoc2VxKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NlcS9hc2VxZHVtcC9NYWtlZmlsZS5hbSBiL3NlcS9hc2VxZHVtcC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTE4ZDlmCi0tLSAvZGV2L251bGwKKysrIGIvc2VxL2FzZXFkdW1wL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNSBAQAorSU5DTFVERVMgPSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorRVhUUkFfRElTVCA9IGFzZXFkdW1wLjEKKworYmluX1BST0dSQU1TID0gYXNlcWR1bXAKK21hbl9NQU5TID0gYXNlcWR1bXAuMQpkaWZmIC0tZ2l0IGEvc2VxL2FzZXFkdW1wL2FzZXFkdW1wLjEgYi9zZXEvYXNlcWR1bXAvYXNlcWR1bXAuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmYyYWE5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VxL2FzZXFkdW1wL2FzZXFkdW1wLjEKQEAgLTAsMCArMSwzOSBAQAorLlRIIEFTRVFEVU1QIDEgIjE5IEZlYiAyMDA1IgorCisuU0ggTkFNRQorYXNlcWR1bXAgXC0gc2hvdyB0aGUgZXZlbnRzIHJlY2VpdmVkIGF0IGFuIEFMU0Egc2VxdWVuY2VyIHBvcnQKKworLlNIIFNZTk9QU0lTCisuQiBhc2VxZHVtcAorW1xmSVwtcCBjbGllbnQ6cG9ydCwuLi5cZlBdCisKKy5TSCBERVNDUklQVElPTgorLkIgYXNlcWR1bXAKK2lzIGEgY29tbWFuZC1saW5lIHV0aWxpdHkgdGhhdCBwcmludHMgdGhlIHNlcXVlbmNlciBldmVudHMgaXQgcmVjZWl2ZXMgYXMgdGV4dC4KKworVG8gc3RvcCByZWNlaXZpbmcsIHByZXNzIEN0cmwrQy4KKworLlNIIE9QVElPTlMKKworLlRQCisuSSBcLWgsXC1cLWhlbHAKK1ByaW50cyBhIGxpc3Qgb2Ygb3B0aW9ucy4KKworLlRQCisuSSBcLVYsXC1cLXZlcnNpb24KK1ByaW50cyB0aGUgY3VycmVudCB2ZXJzaW9uLgorCisuVFAKKy5JIFwtbCxcLVwtbGlzdAorUHJpbnRzIGEgbGlzdCBvZiBwb3NzaWJsZSBpbnB1dCBwb3J0cy4KKworLlRQCisuSSBcLXAsXC1cLXBvcnQ9Y2xpZW50OnBvcnQsLi4uCitTZXRzIHRoZSBzZXF1ZW5jZXIgcG9ydChzKSBmcm9tIHdoaWNoIGV2ZW50cyBhcmUgcmVjZWl2ZWQuCisKK0EgY2xpZW50IGNhbiBiZSBzcGVjaWZpZWQgYnkgaXRzIG51bWJlciwgaXRzIG5hbWUsIG9yIGEgcHJlZml4IG9mIGl0cworbmFtZS4gIEEgcG9ydCBpcyBzcGVjaWZpZWQgYnkgaXRzIG51bWJlcjsgZm9yIHBvcnQgMCBvZiBhIGNsaWVudCwgdGhlCisiOjAiIHBhcnQgb2YgdGhlIHBvcnQgc3BlY2lmaWNhdGlvbiBjYW4gYmUgb21pdHRlZC4KKworLlNIIEFVVEhPUgorQ2xlbWVucyBMYWRpc2NoIDxjbGVtZW5zQGxhZGlzY2guZGU+CmRpZmYgLS1naXQgYS9zZXEvYXNlcWR1bXAvYXNlcWR1bXAuYyBiL3NlcS9hc2VxZHVtcC9hc2VxZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YzVkMjEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXEvYXNlcWR1bXAvYXNlcWR1bXAuYwpAQCAtMCwwICsxLDQzOCBAQAorLyoKKyAqIGFzZXFkdW1wLmMgLSBzaG93IHRoZSBldmVudHMgcmVjZWl2ZWQgYXQgYW4gQUxTQSBzZXF1ZW5jZXIgcG9ydAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4KKyAqCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2luY2x1ZGUgPGFsc2EvYXNvdW5kbGliLmg+CisjaW5jbHVkZSAiYWNvbmZpZy5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKworc3RhdGljIHNuZF9zZXFfdCAqc2VxOworc3RhdGljIGludCBwb3J0X2NvdW50Oworc3RhdGljIHNuZF9zZXFfYWRkcl90ICpwb3J0czsKK3N0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3Qgc3RvcCA9IDA7CisKKworLyogcHJpbnRzIGFuIGVycm9yIG1lc3NhZ2UgdG8gc3RkZXJyLCBhbmQgZGllcyAqLworc3RhdGljIHZvaWQgZmF0YWwoY29uc3QgY2hhciAqbXNnLCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCXZhX3N0YXJ0KGFwLCBtc2cpOworCXZmcHJpbnRmKHN0ZGVyciwgbXNnLCBhcCk7CisJdmFfZW5kKGFwKTsKKwlmcHV0YygnXG4nLCBzdGRlcnIpOworCWV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworLyogbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IgaGFuZGxpbmcgKi8KK3N0YXRpYyB2b2lkIGNoZWNrX21lbSh2b2lkICpwKQoreworCWlmICghcCkKKwkJZmF0YWwoIk91dCBvZiBtZW1vcnkiKTsKK30KKworLyogZXJyb3IgaGFuZGxpbmcgZm9yIEFMU0EgZnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCBjaGVja19zbmQoY29uc3QgY2hhciAqb3BlcmF0aW9uLCBpbnQgZXJyKQoreworCWlmIChlcnIgPCAwKQorCQlmYXRhbCgiQ2Fubm90ICVzIC0gJXMiLCBvcGVyYXRpb24sIHNuZF9zdHJlcnJvcihlcnIpKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9zZXEodm9pZCkKK3sKKwlpbnQgZXJyOworCisJLyogb3BlbiBzZXF1ZW5jZXIgKi8KKwllcnIgPSBzbmRfc2VxX29wZW4oJnNlcSwgImRlZmF1bHQiLCBTTkRfU0VRX09QRU5fRFVQTEVYLCAwKTsKKwljaGVja19zbmQoIm9wZW4gc2VxdWVuY2VyIiwgZXJyKTsKKworCS8qIHNldCBvdXIgY2xpZW50J3MgbmFtZSAqLworCWVyciA9IHNuZF9zZXFfc2V0X2NsaWVudF9uYW1lKHNlcSwgImFzZXFkdW1wIik7CisJY2hlY2tfc25kKCJzZXQgY2xpZW50IG5hbWUiLCBlcnIpOworfQorCisvKiBwYXJzZXMgb25lIG9yIG1vcmUgcG9ydCBhZGRyZXNzZXMgZnJvbSB0aGUgc3RyaW5nICovCitzdGF0aWMgdm9pZCBwYXJzZV9wb3J0cyhjb25zdCBjaGFyICphcmcpCit7CisJY2hhciAqYnVmLCAqcywgKnBvcnRfbmFtZTsKKwlpbnQgZXJyOworCisJLyogbWFrZSBhIGNvcHkgb2YgdGhlIHN0cmluZyBiZWNhdXNlIHdlJ3JlIGdvaW5nIHRvIG1vZGlmeSBpdCAqLworCWJ1ZiA9IHN0cmR1cChhcmcpOworCWNoZWNrX21lbShidWYpOworCisJZm9yIChwb3J0X25hbWUgPSBzID0gYnVmOyBzOyBwb3J0X25hbWUgPSBzICsgMSkgeworCQkvKiBBc3N1bWUgdGhhdCBwb3J0cyBhcmUgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIFdlIGRvbid0IHVzZQorCQkgKiBzcGFjZXMgYmVjYXVzZSB0aG9zZSBhcmUgdmFsaWQgaW4gY2xpZW50IG5hbWVzLiAqLworCQlzID0gc3RyY2hyKHBvcnRfbmFtZSwgJywnKTsKKwkJaWYgKHMpCisJCQkqcyA9ICdcMCc7CisKKwkJKytwb3J0X2NvdW50OworCQlwb3J0cyA9IHJlYWxsb2MocG9ydHMsIHBvcnRfY291bnQgKiBzaXplb2Yoc25kX3NlcV9hZGRyX3QpKTsKKwkJY2hlY2tfbWVtKHBvcnRzKTsKKworCQllcnIgPSBzbmRfc2VxX3BhcnNlX2FkZHJlc3Moc2VxLCAmcG9ydHNbcG9ydF9jb3VudCAtIDFdLCBwb3J0X25hbWUpOworCQlpZiAoZXJyIDwgMCkKKwkJCWZhdGFsKCJJbnZhbGlkIHBvcnQgJXMgLSAlcyIsIHBvcnRfbmFtZSwgc25kX3N0cmVycm9yKGVycikpOworCX0KKworCWZyZWUoYnVmKTsKK30KKworc3RhdGljIHZvaWQgY3JlYXRlX3BvcnQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gc25kX3NlcV9jcmVhdGVfc2ltcGxlX3BvcnQoc2VxLCAiYXNlcWR1bXAiLAorCQkJCQkgU05EX1NFUV9QT1JUX0NBUF9XUklURSB8CisJCQkJCSBTTkRfU0VRX1BPUlRfQ0FQX1NVQlNfV1JJVEUsCisJCQkJCSBTTkRfU0VRX1BPUlRfVFlQRV9NSURJX0dFTkVSSUMgfAorCQkJCQkgU05EX1NFUV9QT1JUX1RZUEVfQVBQTElDQVRJT04pOworCWNoZWNrX3NuZCgiY3JlYXRlIHBvcnQiLCBlcnIpOworfQorCitzdGF0aWMgdm9pZCBjb25uZWN0X3BvcnRzKHZvaWQpCit7CisJaW50IGksIGVycjsKKworCWZvciAoaSA9IDA7IGkgPCBwb3J0X2NvdW50OyArK2kpIHsKKwkJZXJyID0gc25kX3NlcV9jb25uZWN0X2Zyb20oc2VxLCAwLCBwb3J0c1tpXS5jbGllbnQsIHBvcnRzW2ldLnBvcnQpOworCQlpZiAoZXJyIDwgMCkKKwkJCWZhdGFsKCJDYW5ub3QgY29ubmVjdCBmcm9tIHBvcnQgJWQ6JWQgLSAlcyIsCisJCQkgICAgICBwb3J0c1tpXS5jbGllbnQsIHBvcnRzW2ldLnBvcnQsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfZXZlbnQoY29uc3Qgc25kX3NlcV9ldmVudF90ICpldikKK3sKKwlwcmludGYoIiUzZDolLTNkICIsIGV2LT5zb3VyY2UuY2xpZW50LCBldi0+c291cmNlLnBvcnQpOworCXN3aXRjaCAoZXYtPnR5cGUpIHsKKwljYXNlIFNORF9TRVFfRVZFTlRfTk9URU9OOgorCQlpZiAoZXYtPmRhdGEubm90ZS52ZWxvY2l0eSkKKwkJCXByaW50ZigiTm90ZSBvbiAgICAgICAgICAgICAgICAlMmQsIG5vdGUgJWQsIHZlbG9jaXR5ICVkXG4iLAorCQkJICAgICAgIGV2LT5kYXRhLm5vdGUuY2hhbm5lbCwgZXYtPmRhdGEubm90ZS5ub3RlLCBldi0+ZGF0YS5ub3RlLnZlbG9jaXR5KTsKKwkJZWxzZQorCQkJcHJpbnRmKCJOb3RlIG9mZiAgICAgICAgICAgICAgICUyZCwgbm90ZSAlZFxuIiwKKwkJCSAgICAgICBldi0+ZGF0YS5ub3RlLmNoYW5uZWwsIGV2LT5kYXRhLm5vdGUubm90ZSk7CisJCWJyZWFrOworCWNhc2UgU05EX1NFUV9FVkVOVF9OT1RFT0ZGOgorCQlwcmludGYoIk5vdGUgb2ZmICAgICAgICAgICAgICAgJTJkLCBub3RlICVkLCB2ZWxvY2l0eSAlZFxuIiwKKwkJICAgICAgIGV2LT5kYXRhLm5vdGUuY2hhbm5lbCwgZXYtPmRhdGEubm90ZS5ub3RlLCBldi0+ZGF0YS5ub3RlLnZlbG9jaXR5KTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU0VRX0VWRU5UX0tFWVBSRVNTOgorCQlwcmludGYoIlBvbHlwaG9uaWMgYWZ0ZXJ0b3VjaCAgJTJkLCBub3RlICVkLCB2YWx1ZSAlZFxuIiwKKwkJICAgICAgIGV2LT5kYXRhLm5vdGUuY2hhbm5lbCwgZXYtPmRhdGEubm90ZS5ub3RlLCBldi0+ZGF0YS5ub3RlLnZlbG9jaXR5KTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU0VRX0VWRU5UX0NPTlRST0xMRVI6CisJCXByaW50ZigiQ29udHJvbCBjaGFuZ2UgICAgICAgICAlMmQsIGNvbnRyb2xsZXIgJWQsIHZhbHVlICVkXG4iLAorCQkgICAgICAgZXYtPmRhdGEuY29udHJvbC5jaGFubmVsLCBldi0+ZGF0YS5jb250cm9sLnBhcmFtLCBldi0+ZGF0YS5jb250cm9sLnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU0VRX0VWRU5UX1BHTUNIQU5HRToKKwkJcHJpbnRmKCJQcm9ncmFtIGNoYW5nZSAgICAgICAgICUyZCwgcHJvZ3JhbSAlZFxuIiwKKwkJICAgICAgIGV2LT5kYXRhLmNvbnRyb2wuY2hhbm5lbCwgZXYtPmRhdGEuY29udHJvbC52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgU05EX1NFUV9FVkVOVF9DSEFOUFJFU1M6CisJCXByaW50ZigiQ2hhbm5lbCBhZnRlcnRvdWNoICAgICAlMmQsIHZhbHVlICVkXG4iLAorCQkgICAgICAgZXYtPmRhdGEuY29udHJvbC5jaGFubmVsLCBldi0+ZGF0YS5jb250cm9sLnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU0VRX0VWRU5UX1BJVENIQkVORDoKKwkJcHJpbnRmKCJQaXRjaCBiZW5kICAgICAgICAgICAgICUyZCwgdmFsdWUgJWRcbiIsCisJCSAgICAgICBldi0+ZGF0YS5jb250cm9sLmNoYW5uZWwsIGV2LT5kYXRhLmNvbnRyb2wudmFsdWUpOworCQlicmVhazsKKwljYXNlIFNORF9TRVFfRVZFTlRfQ09OVFJPTDE0OgorCQlwcmludGYoIkNvbnRyb2wgY2hhbmdlICAgICAgICAgJTJkLCBjb250cm9sbGVyICVkLCB2YWx1ZSAlNWRcbiIsCisJCSAgICAgICBldi0+ZGF0YS5jb250cm9sLmNoYW5uZWwsIGV2LT5kYXRhLmNvbnRyb2wucGFyYW0sIGV2LT5kYXRhLmNvbnRyb2wudmFsdWUpOworCQlicmVhazsKKwljYXNlIFNORF9TRVFfRVZFTlRfTk9OUkVHUEFSQU06CisJCXByaW50ZigiTm9uLXJlZy4gcGFyYW1ldGVyICAgICAlMmQsIHBhcmFtZXRlciAlZCwgdmFsdWUgJWRcbiIsCisJCSAgICAgICBldi0+ZGF0YS5jb250cm9sLmNoYW5uZWwsIGV2LT5kYXRhLmNvbnRyb2wucGFyYW0sIGV2LT5kYXRhLmNvbnRyb2wudmFsdWUpOworCQlicmVhazsKKwljYXNlIFNORF9TRVFfRVZFTlRfUkVHUEFSQU06CisJCXByaW50ZigiUmVnLiBwYXJhbWV0ZXIgICAgICAgICAlMmQsIHBhcmFtZXRlciAlZCwgdmFsdWUgJWRcbiIsCisJCSAgICAgICBldi0+ZGF0YS5jb250cm9sLmNoYW5uZWwsIGV2LT5kYXRhLmNvbnRyb2wucGFyYW0sIGV2LT5kYXRhLmNvbnRyb2wudmFsdWUpOworCQlicmVhazsKKwljYXNlIFNORF9TRVFfRVZFTlRfU09OR1BPUzoKKwkJcHJpbnRmKCJTb25nIHBvc2l0aW9uIHBvaW50ZXIgICAgICB2YWx1ZSAlZFxuIiwKKwkJICAgICAgIGV2LT5kYXRhLmNvbnRyb2wudmFsdWUpOworCQlicmVhazsKKwljYXNlIFNORF9TRVFfRVZFTlRfU09OR1NFTDoKKwkJcHJpbnRmKCJTb25nIHNlbGVjdCAgICAgICAgICAgICAgICB2YWx1ZSAlZFxuIiwKKwkJICAgICAgIGV2LT5kYXRhLmNvbnRyb2wudmFsdWUpOworCQlicmVhazsKKwljYXNlIFNORF9TRVFfRVZFTlRfUUZSQU1FOgorCQlwcmludGYoIk1UQyBxdWFydGVyIGZyYW1lICAgICAgICAgICUwMnhoXG4iLAorCQkgICAgICAgZXYtPmRhdGEuY29udHJvbC52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgU05EX1NFUV9FVkVOVF9USU1FU0lHTjoKKwkJLy8gWFhYIGhvdyBpcyB0aGlzIGVuY29kZWQ/CisJCXByaW50ZigiU01GIHRpbWUgc2lnbmF0dXJlICAgICAgICAgKCUjMDEweClcbiIsCisJCSAgICAgICBldi0+ZGF0YS5jb250cm9sLnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU0VRX0VWRU5UX0tFWVNJR046CisJCS8vIFhYWCBob3cgaXMgdGhpcyBlbmNvZGVkPworCQlwcmludGYoIlNNRiBrZXkgc2lnbmF0dXJlICAgICAgICAgICglIzAxMHgpXG4iLAorCQkgICAgICAgZXYtPmRhdGEuY29udHJvbC52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgU05EX1NFUV9FVkVOVF9TVEFSVDoKKwkJaWYgKGV2LT5zb3VyY2UuY2xpZW50ID09IFNORF9TRVFfQ0xJRU5UX1NZU1RFTSAmJgorCQkgICAgZXYtPnNvdXJjZS5wb3J0ID09IFNORF9TRVFfUE9SVF9TWVNURU1fVElNRVIpCisJCQlwcmludGYoIlF1ZXVlIHN0YXJ0ICAgICAgICAgICAgICAgIHF1ZXVlICVkXG4iLAorCQkJICAgICAgIGV2LT5kYXRhLnF1ZXVlLnF1ZXVlKTsKKwkJZWxzZQorCQkJcHJpbnRmKCJTdGFydFxuIik7CisJCWJyZWFrOworCWNhc2UgU05EX1NFUV9FVkVOVF9DT05USU5VRToKKwkJaWYgKGV2LT5zb3VyY2UuY2xpZW50ID09IFNORF9TRVFfQ0xJRU5UX1NZU1RFTSAmJgorCQkgICAgZXYtPnNvdXJjZS5wb3J0ID09IFNORF9TRVFfUE9SVF9TWVNURU1fVElNRVIpCisJCQlwcmludGYoIlF1ZXVlIGNvbnRpbnVlICAgICAgICAgICAgIHF1ZXVlICVkXG4iLAorCQkJICAgICAgIGV2LT5kYXRhLnF1ZXVlLnF1ZXVlKTsKKwkJZWxzZQorCQkJcHJpbnRmKCJDb250aW51ZVxuIik7CisJCWJyZWFrOworCWNhc2UgU05EX1NFUV9FVkVOVF9TVE9QOgorCQlpZiAoZXYtPnNvdXJjZS5jbGllbnQgPT0gU05EX1NFUV9DTElFTlRfU1lTVEVNICYmCisJCSAgICBldi0+c291cmNlLnBvcnQgPT0gU05EX1NFUV9QT1JUX1NZU1RFTV9USU1FUikKKwkJCXByaW50ZigiUXVldWUgc3RvcCAgICAgICAgICAgICAgICAgcXVldWUgJWRcbiIsCisJCQkgICAgICAgZXYtPmRhdGEucXVldWUucXVldWUpOworCQllbHNlCisJCQlwcmludGYoIlN0b3BcbiIpOworCQlicmVhazsKKwljYXNlIFNORF9TRVFfRVZFTlRfU0VUUE9TX1RJQ0s6CisJCXByaW50ZigiU2V0IHRpY2sgcXVldWUgcG9zLiAgICAgICAgcXVldWUgJWRcbiIsIGV2LT5kYXRhLnF1ZXVlLnF1ZXVlKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU0VRX0VWRU5UX1NFVFBPU19USU1FOgorCQlwcmludGYoIlNldCBydCBxdWV1ZSBwb3MuICAgICAgICAgIHF1ZXVlICVkXG4iLCBldi0+ZGF0YS5xdWV1ZS5xdWV1ZSk7CisJCWJyZWFrOworCWNhc2UgU05EX1NFUV9FVkVOVF9URU1QTzoKKwkJcHJpbnRmKCJTZXQgcXVldWUgdGVtcG8gICAgICAgICAgICBxdWV1ZSAlZFxuIiwgZXYtPmRhdGEucXVldWUucXVldWUpOworCQlicmVhazsKKwljYXNlIFNORF9TRVFfRVZFTlRfQ0xPQ0s6CisJCXByaW50ZigiQ2xvY2tcbiIpOworCQlicmVhazsKKwljYXNlIFNORF9TRVFfRVZFTlRfVElDSzoKKwkJcHJpbnRmKCJUaWNrXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU0VRX0VWRU5UX1FVRVVFX1NLRVc6CisJCXByaW50ZigiUXVldWUgdGltZXIgc2tldyAgICAgICAgICAgcXVldWUgJWRcbiIsIGV2LT5kYXRhLnF1ZXVlLnF1ZXVlKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU0VRX0VWRU5UX1RVTkVfUkVRVUVTVDoKKwkJcHJpbnRmKCJUdW5lIHJlcXVlc3RcbiIpOworCQlicmVhazsKKwljYXNlIFNORF9TRVFfRVZFTlRfUkVTRVQ6CisJCXByaW50ZigiUmVzZXRcbiIpOworCQlicmVhazsKKwljYXNlIFNORF9TRVFfRVZFTlRfU0VOU0lORzoKKwkJcHJpbnRmKCJBY3RpdmUgU2Vuc2luZ1xuIik7CisJCWJyZWFrOworCWNhc2UgU05EX1NFUV9FVkVOVF9DTElFTlRfU1RBUlQ6CisJCXByaW50ZigiQ2xpZW50IHN0YXJ0ICAgICAgICAgICAgICAgY2xpZW50ICVkXG4iLAorCQkgICAgICAgZXYtPmRhdGEuYWRkci5jbGllbnQpOworCQlicmVhazsKKwljYXNlIFNORF9TRVFfRVZFTlRfQ0xJRU5UX0VYSVQ6CisJCXByaW50ZigiQ2xpZW50IGV4aXQgICAgICAgICAgICAgICAgY2xpZW50ICVkXG4iLAorCQkgICAgICAgZXYtPmRhdGEuYWRkci5jbGllbnQpOworCQlicmVhazsKKwljYXNlIFNORF9TRVFfRVZFTlRfQ0xJRU5UX0NIQU5HRToKKwkJcHJpbnRmKCJDbGllbnQgY2hhbmdlZCAgICAgICAgICAgICBjbGllbnQgJWRcbiIsCisJCSAgICAgICBldi0+ZGF0YS5hZGRyLmNsaWVudCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NFUV9FVkVOVF9QT1JUX1NUQVJUOgorCQlwcmludGYoIlBvcnQgc3RhcnQgICAgICAgICAgICAgICAgICVkOiVkXG4iLAorCQkgICAgICAgZXYtPmRhdGEuYWRkci5jbGllbnQsIGV2LT5kYXRhLmFkZHIucG9ydCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NFUV9FVkVOVF9QT1JUX0VYSVQ6CisJCXByaW50ZigiUG9ydCBleGl0ICAgICAgICAgICAgICAgICAgJWQ6JWRcbiIsCisJCSAgICAgICBldi0+ZGF0YS5hZGRyLmNsaWVudCwgZXYtPmRhdGEuYWRkci5wb3J0KTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU0VRX0VWRU5UX1BPUlRfQ0hBTkdFOgorCQlwcmludGYoIlBvcnQgY2hhbmdlZCAgICAgICAgICAgICAgICVkOiVkXG4iLAorCQkgICAgICAgZXYtPmRhdGEuYWRkci5jbGllbnQsIGV2LT5kYXRhLmFkZHIucG9ydCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NFUV9FVkVOVF9QT1JUX1NVQlNDUklCRUQ6CisJCXByaW50ZigiUG9ydCBzdWJzY3JpYmVkICAgICAgICAgICAgJWQ6JWQgLT4gJWQ6JWRcbiIsCisJCSAgICAgICBldi0+ZGF0YS5jb25uZWN0LnNlbmRlci5jbGllbnQsIGV2LT5kYXRhLmNvbm5lY3Quc2VuZGVyLnBvcnQsCisJCSAgICAgICBldi0+ZGF0YS5jb25uZWN0LmRlc3QuY2xpZW50LCBldi0+ZGF0YS5jb25uZWN0LmRlc3QucG9ydCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NFUV9FVkVOVF9QT1JUX1VOU1VCU0NSSUJFRDoKKwkJcHJpbnRmKCJQb3J0IHVuc3Vic2NyaWJlZCAgICAgICAgICAlZDolZCAtPiAlZDolZFxuIiwKKwkJICAgICAgIGV2LT5kYXRhLmNvbm5lY3Quc2VuZGVyLmNsaWVudCwgZXYtPmRhdGEuY29ubmVjdC5zZW5kZXIucG9ydCwKKwkJICAgICAgIGV2LT5kYXRhLmNvbm5lY3QuZGVzdC5jbGllbnQsIGV2LT5kYXRhLmNvbm5lY3QuZGVzdC5wb3J0KTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU0VRX0VWRU5UX1NZU0VYOgorCQl7CisJCQl1bnNpZ25lZCBpbnQgaTsKKwkJCXByaW50ZigiU3lzdGVtIGV4Y2x1c2l2ZSAgICAgICAgICAiKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBldi0+ZGF0YS5leHQubGVuOyArK2kpCisJCQkJcHJpbnRmKCIgJTAyWCIsICgodW5zaWduZWQgY2hhciopZXYtPmRhdGEuZXh0LnB0cilbaV0pOworCQkJcHJpbnRmKCJcbiIpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiRXZlbnQgdHlwZSAlZFxuIiwgIGV2LT50eXBlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGxpc3RfcG9ydHModm9pZCkKK3sKKwlzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmNpbmZvOworCXNuZF9zZXFfcG9ydF9pbmZvX3QgKnBpbmZvOworCisJc25kX3NlcV9jbGllbnRfaW5mb19hbGxvY2EoJmNpbmZvKTsKKwlzbmRfc2VxX3BvcnRfaW5mb19hbGxvY2EoJnBpbmZvKTsKKworCXB1dHMoIiBQb3J0ICAgIENsaWVudCBuYW1lICAgICAgICAgICAgICAgICAgICAgIFBvcnQgbmFtZSIpOworCisJc25kX3NlcV9jbGllbnRfaW5mb19zZXRfY2xpZW50KGNpbmZvLCAtMSk7CisJd2hpbGUgKHNuZF9zZXFfcXVlcnlfbmV4dF9jbGllbnQoc2VxLCBjaW5mbykgPj0gMCkgeworCQlpbnQgY2xpZW50ID0gc25kX3NlcV9jbGllbnRfaW5mb19nZXRfY2xpZW50KGNpbmZvKTsKKworCQlzbmRfc2VxX3BvcnRfaW5mb19zZXRfY2xpZW50KHBpbmZvLCBjbGllbnQpOworCQlzbmRfc2VxX3BvcnRfaW5mb19zZXRfcG9ydChwaW5mbywgLTEpOworCQl3aGlsZSAoc25kX3NlcV9xdWVyeV9uZXh0X3BvcnQoc2VxLCBwaW5mbykgPj0gMCkgeworCQkJLyogd2UgbmVlZCBib3RoIFJFQUQgYW5kIFNVQlNfUkVBRCAqLworCQkJaWYgKChzbmRfc2VxX3BvcnRfaW5mb19nZXRfY2FwYWJpbGl0eShwaW5mbykKKwkJCSAgICAgJiAoU05EX1NFUV9QT1JUX0NBUF9SRUFEIHwgU05EX1NFUV9QT1JUX0NBUF9TVUJTX1JFQUQpKQorCQkJICAgICE9IChTTkRfU0VRX1BPUlRfQ0FQX1JFQUQgfCBTTkRfU0VRX1BPUlRfQ0FQX1NVQlNfUkVBRCkpCisJCQkJY29udGludWU7CisJCQlwcmludGYoIiUzZDolLTNkICAlLTMyLjMycyAlc1xuIiwKKwkJCSAgICAgICBzbmRfc2VxX3BvcnRfaW5mb19nZXRfY2xpZW50KHBpbmZvKSwKKwkJCSAgICAgICBzbmRfc2VxX3BvcnRfaW5mb19nZXRfcG9ydChwaW5mbyksCisJCQkgICAgICAgc25kX3NlcV9jbGllbnRfaW5mb19nZXRfbmFtZShjaW5mbyksCisJCQkgICAgICAgc25kX3NlcV9wb3J0X2luZm9fZ2V0X25hbWUocGluZm8pKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgaGVscChjb25zdCBjaGFyICphcmd2MCkKK3sKKwlwcmludGYoIlVzYWdlOiAlcyBbb3B0aW9uc11cbiIKKwkJIlxuQXZhaWxhYmxlIG9wdGlvbnM6XG4iCisJCSIgIC1oLC0taGVscCAgICAgICAgICAgICAgICAgIHRoaXMgaGVscFxuIgorCQkiICAtViwtLXZlcnNpb24gICAgICAgICAgICAgICBzaG93IHZlcnNpb25cbiIKKwkJIiAgLWwsLS1saXN0ICAgICAgICAgICAgICAgICAgbGlzdCBpbnB1dCBwb3J0c1xuIgorCQkiICAtcCwtLXBvcnQ9Y2xpZW50OnBvcnQsLi4uICBzb3VyY2UgcG9ydChzKVxuIiwKKwkJYXJndjApOworfQorCitzdGF0aWMgdm9pZCB2ZXJzaW9uKHZvaWQpCit7CisJcHV0cygiYXNlcWR1bXAgdmVyc2lvbiAiIFNORF9VVElMX1ZFUlNJT05fU1RSKTsKK30KKworc3RhdGljIHZvaWQgc2lnaGFuZGxlcihpbnQgc2lnKQoreworCXN0b3AgPSAxOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXN0YXRpYyBjb25zdCBjaGFyIHNob3J0X29wdGlvbnNbXSA9ICJoVmxwOiI7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJCXsiaGVscCIsIDAsIE5VTEwsICdoJ30sCisJCXsidmVyc2lvbiIsIDAsIE5VTEwsICdWJ30sCisJCXsibGlzdCIsIDAsIE5VTEwsICdsJ30sCisJCXsicG9ydCIsIDEsIE5VTEwsICdwJ30sCisJCXsgfQorCX07CisKKwlpbnQgZG9fbGlzdCA9IDA7CisJc3RydWN0IHBvbGxmZCAqcGZkczsKKwlpbnQgbnBmZHM7CisJaW50IGMsIGVycjsKKworCWluaXRfc2VxKCk7CisKKwl3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCBzaG9ydF9vcHRpb25zLAorCQkJCWxvbmdfb3B0aW9ucywgTlVMTCkpICE9IC0xKSB7CisJCXN3aXRjaCAoYykgeworCQljYXNlICdoJzoKKwkJCWhlbHAoYXJndlswXSk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSAnVic6CisJCQl2ZXJzaW9uKCk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSAnbCc6CisJCQlkb19saXN0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdwJzoKKwkJCXBhcnNlX3BvcnRzKG9wdGFyZyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWhlbHAoYXJndlswXSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlpZiAob3B0aW5kIDwgYXJnYykgeworCQloZWxwKGFyZ3ZbMF0pOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoZG9fbGlzdCkgeworCQlsaXN0X3BvcnRzKCk7CisJCXJldHVybiAwOworCX0KKworCWNyZWF0ZV9wb3J0KCk7CisJY29ubmVjdF9wb3J0cygpOworCisJZXJyID0gc25kX3NlcV9ub25ibG9jayhzZXEsIDEpOworCWNoZWNrX3NuZCgic2V0IG5vbmJsb2NrIG1vZGUiLCBlcnIpOworCQorCWlmIChwb3J0X2NvdW50ID4gMCkKKwkJcHJpbnRmKCJXYWl0aW5nIGZvciBkYXRhLiIpOworCWVsc2UKKwkJcHJpbnRmKCJXYWl0aW5nIGZvciBkYXRhIGF0IHBvcnQgJWQ6MC4iLAorCQkgICAgICAgc25kX3NlcV9jbGllbnRfaWQoc2VxKSk7CisJcHJpbnRmKCIgUHJlc3MgQ3RybCtDIHRvIGVuZC5cbiIpOworCXByaW50ZigiU291cmNlICBFdmVudCAgICAgICAgICAgICAgICAgIENoICBEYXRhXG4iKTsKKwkKKwlzaWduYWwoU0lHSU5ULCBzaWdoYW5kbGVyKTsKKwlzaWduYWwoU0lHVEVSTSwgc2lnaGFuZGxlcik7CisKKwlucGZkcyA9IHNuZF9zZXFfcG9sbF9kZXNjcmlwdG9yc19jb3VudChzZXEsIFBPTExJTik7CisJcGZkcyA9IGFsbG9jYShzaXplb2YoKnBmZHMpICogbnBmZHMpOworCWZvciAoOzspIHsKKwkJc25kX3NlcV9wb2xsX2Rlc2NyaXB0b3JzKHNlcSwgcGZkcywgbnBmZHMsIFBPTExJTik7CisJCWlmIChwb2xsKHBmZHMsIG5wZmRzLCAtMSkgPCAwKQorCQkJYnJlYWs7CisJCWRvIHsKKwkJCXNuZF9zZXFfZXZlbnRfdCAqZXZlbnQ7CisJCQllcnIgPSBzbmRfc2VxX2V2ZW50X2lucHV0KHNlcSwgJmV2ZW50KTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCWJyZWFrOworCQkJaWYgKGV2ZW50KQorCQkJCWR1bXBfZXZlbnQoZXZlbnQpOworCQl9IHdoaWxlIChlcnIgPiAwKTsKKwkJZmZsdXNoKHN0ZG91dCk7CisJCWlmIChzdG9wKQorCQkJYnJlYWs7CisJfQorCisJc25kX3NlcV9jbG9zZShzZXEpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2VxL2FzZXFuZXQvTWFrZWZpbGUuYW0gYi9zZXEvYXNlcW5ldC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWJjNGE1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VxL2FzZXFuZXQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw3IEBACitJTkNMVURFUyA9IC1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlCitFWFRSQV9ESVNUID0gUkVBRE1FLmFzZXFuZXQgYXNlcW5ldC4xCisKK2Jpbl9QUk9HUkFNUyA9IGFzZXFuZXQKK2FzZXFuZXRfU09VUkNFUyA9IGFzZXFuZXQuYworYXNlcW5ldF9MREFERCA9ICQoSU5UTExJQlMpCittYW5fTUFOUyA9IGFzZXFuZXQuMQpkaWZmIC0tZ2l0IGEvc2VxL2FzZXFuZXQvUkVBRE1FLmFzZXFuZXQgYi9zZXEvYXNlcW5ldC9SRUFETUUuYXNlcW5ldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDBiNjhlCi0tLSAvZGV2L251bGwKKysrIGIvc2VxL2FzZXFuZXQvUkVBRE1FLmFzZXFuZXQKQEAgLTAsMCArMSw1MyBAQAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCUFMU0Egc2VxdWVuY2VyIGNvbm5lY3RvcnMgb3ZlciBuZXR3b3JrCisJCXZlci4wLjEKKwlDb3B5cmlnaHQgKEMpIDE5OTktMjAwMCBUYWthc2hpIEl3YWkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKiBBU0VRTkVUCisKK2FzZXFuZXQgaXMgYSBzZXF1ZW5jZXIgY2xpZW50IHdoaWNoIHNlbmRzL3JlY2VpdmVzIGV2ZW50cyBvdmVyCituZXR3b3JrLiAgU3VwcG9zZSB0d28gaG9zdHMgKGhvc3RBIGFuZCBob3N0QikgY29ubmVjdGVkIGJ5IG5ldHdvcmsuCitZb3UgbmVlZCB0byBydW4gQUxTQSBzeXN0ZW0gb24gYm90aCBob3N0cy4gIFRoZW4sIHN0YXJ0IGFzZXFuZXQgYXMgYQorc2VydmVyIG9uIGhvc3RBOgorCisJaG9zdEElIGFzZXFuZXQKKwlzZXF1ZW5jZXIgb3BlbmVkOiAxMjg6MAorCitBIHVzZXIgY2xpZW50IDEyOCB3aXRoIHBvcnQgMCB3YXMgb3BlbmVkLiAoVGhlIGNsaWVudCBudW1iZXIgbWF5Cit2YXJ5LikgIEF0IG5leHQsIHN0YXJ0IGNsaWVudCBvbiBob3N0Qi4gIFRoZSBhcmd1bWVudCBpcyB0aGUgaG9zdG5hbWUKK3doZXJlIHNlcnZlciBpcyBydW5uaW5nLgorCisJaG9zdEIlIGFzZXFuZXQgaG9zdEEKKwlzZXF1ZW5jZXIgb3BlbmVkOiAxMzI6MAorCitOb3cgZXZlbnRzIHNlbnQgdG8gaG9zdEE6MTI4OjAgaXMgdHJhbnNmZXJyZWQgdG8gaG9zdEI6MTMyOjAsIGFuZCB2aWNlCit2ZXJzYS4KKworWW91IGNhbiBjb25uZWN0IHRoZXNlIHBvcnRzIGFyYml0cmFyeSB0byBvdGhlciBzZXF1ZW5jZXIgcG9ydHMuCitGb3IgZXhhbXBsZSwgY29ubmVjdCBob3N0QjoxMzI6MCB0byBhIE1JREkgb3V0cHV0IGRldmljZSA2NTowLiAgVGhlCithY29ubmVjdCB1dGlsaXR5IGNhbiBiZSB1c2VkIGZvciB0aGlzOgorCisJaG9zdEIlIGFjb25uZWN0IDEzMjowIDY1OjAKKworRXZlbnRzIHRvIGhvc3RBOjEyODowIHdpbGwgYmUgZGVsaXZlcmVkIGluZGlyZWN0bHkgdG8gaG9zdEI6NjU6MC4KK1lvdSdsbCBoZWFyIE1JREkgc291bmRzIGFzIGZvbGxvd2luZzoKKworCWhvc3RBJSBwbWlkaSAtcCAxMjg6MCBmb28ubWlkCisKK1RoZSBtdWx0aXBsZSBjbGllbnRzIG1heSBleGlzdCBzaW11bHRhbmVvdXNseS4gIElmIGhvc3RDIGlzIGNvbm5lY3RlZAorYXMgYSBjbGllbnQgdG8gaG9zdEEsIGV2ZW50cyBmcm9tIGZyb20gaG9zdEEgYXJlIHNlbnQgdG8gYWxsIGNvbm5lY3RlZAorbmV0d29yayBjbGllbnRzLCBob3N0QiBhbmQgaG9zdEMuICBIb3dldmVyLCBvbmx5IG9uZSBjb25uZWN0aW9uIGlzCithbGxvd2VkIGZyb20gYSBjbGllbnQgdG8gYSBzZXJ2ZXIuCisKK1RvIGRpc2Nvbm5lY3QgbmV0d29yaywgc3RvcCBhbGwgY2xpZW50cyBiZWZvcmUgc2VydmVyIGJ5IGN0cmwtQyBvcgorc2VuZGluZyBzaWduYWwgdG8gdGhlbS4gIFRoZSBzZXJ2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IHF1aXQuCisKK1RoZSBhdmFpbGFibGUgb3B0aW9ucyBhcmU6CisKKyAgLXAgcG9ydCA6IHNwZWNpZnkgdGhlIFRDUCBwb3J0IG51bWJlciBvciBUQ1Agc2VydmljZSBuYW1lLgorICAgICAgICAgICAgRGVmYXVsdCB2YWx1ZSBpcyA0MDAwMi4KKyAgLXMgYWRkciA6IGV4cGxpY2l0IHJlYWQtc3Vic2NyaXB0aW9uIHRvIHRoZSBnaXZlbiBhZGRyZXNzCisgICAgICAgICAgICAoY2xpZW50OmFkZHIpLgorICAtZCBhZGRyIDogZXhwbGljaXQgd3JpdGUtc3Vic2NyaXB0aW9uIHRvIHRoZSBnaXZlbiBhZGRyZXNzLgorICAtdiAgICAgIDogdmVyYm9zZSBtb2RlLgpkaWZmIC0tZ2l0IGEvc2VxL2FzZXFuZXQvYXNlcW5ldC4xIGIvc2VxL2FzZXFuZXQvYXNlcW5ldC4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZGMxZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXEvYXNlcW5ldC9hc2VxbmV0LjEKQEAgLTAsMCArMSw4MSBAQAorLlRIIGFzZXFuZXQgMSAiSmFudWFyeSAxLCAyMDAwIgorLkxPIDEKKy5TSCBOQU1FCithc2VxbmV0IFwtIEFMU0Egc2VxdWVuY2VyIGNvbm5lY3RvcnMgb3ZlciBuZXR3b3JrCisKKy5TSCBTWU5PUFNJUworLkIgYXNlcW5ldAorW3JlbW90ZWhvc3RdCisKKy5TSCBERVNDUklQVElPTgorLkIgYXNlcW5ldAoraXMgYW4gQUxTQSBzZXF1ZW5jZXIgY2xpZW50IHdoaWNoIHNlbmRzIGFuZCByZWNlaXZlcyBldmVudCBwYWNrZXRzCitvdmVyIG5ldHdvcmsuCitTdXBwb3NlIHR3byBob3N0cyBjb25uZWN0ZWQgYnkgbmV0d29yaywKKy5JIGhvc3RBCithcyBhIHNlcnZlcgorYW5kCisuSSBob3N0QgorYXMgYSBjbGllbnQuCitUaGUgQUxTQSBzZXF1ZW5jZXIgc3lzdGVtIG11c3QgYmUgcnVubmluZyBvbiBib3RoIGhvc3RzLgorRm9yIGNyZWF0aW5nIHRoZSBzZXJ2ZXIgcG9ydCwgcnVuIHRoZSBmb2xsb3dpbmcgb24gaG9zdEE6CisuSVAgIiIgNAoraG9zdEElIGFzZXFuZXQKKy5icgorc2VxdWVuY2VyIG9wZW5lZDogMTI4OjAKKy5QUAorVGhlbiBhIHVzZXIgY2xpZW50IDEyOCB3aXRoIHBvcnQgMCB3YXMgb3BlbmVkIG9uIGhvc3RBLgorKFRoZSBjbGllbnQgbnVtYmVyIG1heSB2YXJ5LikKK0ZvciBjcmVhdGluZyB0aGUgKG5ldHdvcmstKWNsaWVudCBwb3J0LCBydW4KKy5CIGFzZXFuZXQKK3dpdGggdGhlIGhvc3RuYW1lIG9mIHRoZSBzZXJ2ZXI6CisuSVAgIiIgNAoraG9zdEIlIGFzZXFuZXQgaG9zdEEKKy5icgorc2VxdWVuY2VyIG9wZW5lZDogMTMyOjAKKy5QUAorTm93IGFsbCBldmVudHMgc2VudCB0byBob3N0QToxMjg6MCBhcmUgdHJhbnNmZXJyZWQgdG8gaG9zdEI6MTMyOjAsIGFuZCB2aWNlCit2ZXJzYS4KKy5QUAorVGhlIHBvcnRzIGNyZWF0ZWQgYnkKKy5CIGFzZXFuZXQKK2NhbiBiZSBjb25uZWN0ZWQgYXJiaXRyYXJ5IHRvIG90aGVyIHNlcXVlbmNlciBwb3J0cyB2aWEKKy5CIGFjb25uZWN0KDEpLgorRm9yIGV4YW1wbGUsIHRvIGNvbm5lY3QgaG9zdEI6MTMyOjAgdG8gYSBNSURJIG91dHB1dCBkZXZpY2UgNjU6MDoKKy5JUCAiIiA0Citob3N0QiUgYWNvbm5lY3QgMTMyOjAgNjU6MAorLlBQCitUaGVuIGV2ZW50cyB0byBob3N0QToxMjg6MCB3aWxsIGJlIGRlbGl2ZXJlZCB0byBob3N0Qjo2NTowLgorVGhlIGZvbGxvd2luZyBjb21tYW5kIHBsYXlzIE1JREkgb24KKy5JIGhvc3RCLgorLklQICIiIDQKK2hvc3RBJSBwbWlkaSBcLXAgMTI4OjAgZm9vLm1pZAorLlBQCitUaGUgbXVsdGlwbGUgY2xpZW50cyBtYXkgZXhpc3Qgc2ltdWx0YW5lb3VzbHkuICBJZgorLkkgaG9zdEMKK2lzIGNvbm5lY3RlZCBhcyBhIGNsaWVudCB0byBob3N0QSwgZXZlbnRzIGZyb20gZnJvbSBob3N0QSBhcmUgc2VudAordG8gYWxsIGNvbm5lY3RlZCBuZXR3b3JrIGNsaWVudHMsIGkuZS4gaG9zdEIgYW5kIGhvc3RDLgorSG93ZXZlciwgb25seSBvbmUgY29ubmVjdGlvbiBpcyBhbGxvd2VkIGZyb20gYSBjbGllbnQgdG8gYSBzZXJ2ZXIuCisuUFAKK1RvIGRpc2Nvbm5lY3QgbmV0d29yaywgc3RvcCBhbGwgY2xpZW50cyBiZWZvcmUgc2VydmVyIGJ5IGN0cmwtQyBvcgorc2VuZGluZyBzaWduYWwgdG8gdGhlbS4gIFRoZSBzZXJ2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IHF1aXQuCisKKy5TSCBPUFRJT05TCisuVFAKKy5CIFwtcCBwb3J0CitTcGVjaWZ5IHRoZSBUQ1AgcG9ydCBudW1iZXIgb3IgVENQIHNlcnZpY2UgbmFtZS4KKy5UUAorLkIgXC1zIGFkZHIKK1N1YnNjcmliZSB0byB0aGUgZ2l2ZW4gYWRkcmVzcyBmb3IgcmVhZCBhdXRvbWF0aWNhbGx5LgorLlRQCisuQiBcLWQgYWRkcgorU3Vic2NyaWJlIHRvIHRoZSBnaXZlbiBhZGRyZXNzIGZvciB3cml0ZSBhdXRvbWF0aWNhbGx5LgorLlRQCisuQiBcLXYKK1ZlcmJvc2UgbW9kZS4KKworLlNIICJTRUUgQUxTTyIKK2Fjb25uZWN0KDEpLCBwbWlkaSgxKQorCisuU0ggQVVUSE9SCitUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+LgpkaWZmIC0tZ2l0IGEvc2VxL2FzZXFuZXQvYXNlcW5ldC5jIGIvc2VxL2FzZXFuZXQvYXNlcW5ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNzFhZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXEvYXNlcW5ldC9hc2VxbmV0LmMKQEAgLTAsMCArMSw2MDkgQEAKKy8qCisgKiBuZXR3b3JrIHNlcnZlci9jbGllbnQgZm9yIEFMU0Egc2VxdWVuY2VyCisgKiAgIHZlci4wLjEKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMCBUYWthc2hpIEl3YWkKKyAqIAorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPGxvY2FsZS5oPgorI2luY2x1ZGUgPGFsc2EvYXNvdW5kbGliLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAiYWNvbmZpZy5oIgorI2luY2x1ZGUgImdldHRleHQuaCIKKworLyoKKyAqIHByb3RvdHlwZXMKKyAqLworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCk7CitzdGF0aWMgdm9pZCBpbml0X2J1Zih2b2lkKTsKK3N0YXRpYyB2b2lkIGluaXRfcG9sbGZkcyh2b2lkKTsKK3N0YXRpYyB2b2lkIGNsb3NlX2ZpbGVzKHZvaWQpOworc3RhdGljIHZvaWQgaW5pdF9zZXEoY2hhciAqc291cmNlLCBjaGFyICpkZXN0KTsKK3N0YXRpYyBpbnQgZ2V0X3BvcnQoY2hhciAqc2VydmljZSk7CitzdGF0aWMgdm9pZCBzaWd0ZXJtX2V4aXQoaW50IHNpZyk7CitzdGF0aWMgdm9pZCBpbml0X3NlcnZlcihpbnQgcG9ydCk7CitzdGF0aWMgdm9pZCBpbml0X2NsaWVudChjaGFyICpzZXJ2ZXIsIGludCBwb3J0KTsKK3N0YXRpYyB2b2lkIGRvX2xvb3Aodm9pZCk7CitzdGF0aWMgaW50IGNvcHlfbG9jYWxfdG9fcmVtb3RlKHZvaWQpOworc3RhdGljIGludCBjb3B5X3JlbW90ZV90b19sb2NhbChpbnQgZmQpOworCisvKgorICogZGVmYXVsdCBUQ1AgcG9ydCBudW1iZXIKKyAqLworI2RlZmluZSBERUZBVUxUX1BPUlQJNDAwMDIKKworLyoKKyAqIGxvY2FsIGlucHV0IGJ1ZmZlcgorICovCitzdGF0aWMgY2hhciAqcmVhZGJ1ZjsKK3N0YXRpYyBpbnQgbWF4X3JkbGVuOworc3RhdGljIGNoYXIgKndyaXRlYnVmOworc3RhdGljIGludCBjdXJfd3JsZW4sIG1heF93cmxlbjsKKworI2RlZmluZSBNQVhfQlVGX0VWRU5UUwkyMDAKKyNkZWZpbmUgTUFYX0NPTk5FQ1RJT04JMTAKKworc3RhdGljIHNuZF9zZXFfdCAqaGFuZGxlOworc3RhdGljIHN0cnVjdCBwb2xsZmQgKnNlcWlmZHMgPSBOVUxMOworc3RhdGljIHN0cnVjdCBwb2xsZmQgKnNlcW9mZHMgPSBOVUxMOworc3RhdGljIHN0cnVjdCBwb2xsZmQgKnBvbGxmZHMgPSBOVUxMOworc3RhdGljIGludCBzZXFpZmRzX2NvdW50ID0gMDsKK3N0YXRpYyBpbnQgc2Vxb2Zkc19jb3VudCA9IDA7CitzdGF0aWMgaW50IHBvbGxmZHNfY291bnQgPSAwOworc3RhdGljIGludCBzb2NrZmQsIG5ldGZkW01BWF9DT05ORUNUSU9OXSA9IHtbMCAuLi4gTUFYX0NPTk5FQ1RJT04tMV0gPSAtMX07CitzdGF0aWMgaW50IG1heF9jb25uZWN0aW9uOworc3RhdGljIGludCBjdXJfY29ubmVjdGVkOworc3RhdGljIGludCBzZXFfcG9ydDsKKworc3RhdGljIGludCBzZXJ2ZXJfbW9kZTsKK3N0YXRpYyBpbnQgdmVyYm9zZSA9IDA7CitzdGF0aWMgaW50IGluZm8gPSAwOworCisKKy8qCisgKiBtYWluIHJvdXRpbmUKKyAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbltdID0geworCXsicG9ydCIsIDEsIE5VTEwsICdwJ30sCisJeyJzb3VyY2UiLCAxLCBOVUxMLCAncyd9LAorCXsiZGVzdCIsIDEsIE5VTEwsICdkJ30sCisJeyJoZWxwIiwgMCwgTlVMTCwgJ2gnfSwKKwl7InZlcmJvc2UiLCAwLCBOVUxMLCAndid9LAorCXsiaW5mbyIsIDAsIE5VTEwsICdpJ30sCisJe05VTEwsIDAsIE5VTEwsIDB9LAorfTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBjOworCWludCBwb3J0ID0gREVGQVVMVF9QT1JUOworCWNoYXIgKnNvdXJjZSA9IE5VTEwsICpkZXN0ID0gTlVMTDsKKworI2lmZGVmIEVOQUJMRV9OTFMKKwlzZXRsb2NhbGUoTENfQUxMLCAiIik7CisJdGV4dGRvbWFpbihQQUNLQUdFKTsKKyNlbmRpZgorCisJd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgInA6czpkOnZpIiwgbG9uZ19vcHRpb24sIE5VTEwpKSAhPSAtMSkgeworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAncCc6CisJCQlpZiAoaXNkaWdpdCgqb3B0YXJnKSkKKwkJCQlwb3J0ID0gYXRvaShvcHRhcmcpOworCQkJZWxzZQorCQkJCXBvcnQgPSBnZXRfcG9ydChvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJc291cmNlID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJZGVzdCA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICd2JzoKKwkJCXZlcmJvc2UrKzsKKwkJCWJyZWFrOworCQljYXNlICdpJzoKKwkJCWluZm8rKzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdXNhZ2UoKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisKKwlzaWduYWwoU0lHSU5ULCBzaWd0ZXJtX2V4aXQpOworCXNpZ25hbChTSUdURVJNLCBzaWd0ZXJtX2V4aXQpOworCisJaW5pdF9idWYoKTsKKwlpbml0X3NlcShzb3VyY2UsIGRlc3QpOworCisJaWYgKG9wdGluZCA+PSBhcmdjKSB7CisJCXNlcnZlcl9tb2RlID0gMTsKKwkJbWF4X2Nvbm5lY3Rpb24gPSBNQVhfQ09OTkVDVElPTjsKKwkJaW5pdF9wb2xsZmRzKCk7CisJCWluaXRfc2VydmVyKHBvcnQpOworCX0gZWxzZSB7CisJCXNlcnZlcl9tb2RlID0gMDsKKwkJbWF4X2Nvbm5lY3Rpb24gPSAxOworCQlpbml0X3BvbGxmZHMoKTsKKwkJaW5pdF9jbGllbnQoYXJndltvcHRpbmRdLCBwb3J0KTsKKwl9CisKKwlkb19sb29wKCk7CisKKwljbG9zZV9maWxlcygpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIHByaW50IHVzYWdlCisgKi8KK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJcHJpbnRmKF8oImFzZXFuZXQgLSBuZXR3b3JrIGNsaWVudC9zZXJ2ZXIgb24gQUxTQSBzZXF1ZW5jZXJcbiIpKTsKKwlwcmludGYoXygiICBDb3B5cmlnaHQgKEMpIDE5OTkgVGFrYXNoaSBJd2FpXG4iKSk7CisJcHJpbnRmKF8oInVzYWdlOlxuIikpOworCXByaW50ZihfKCIgIHNlcnZlciBtb2RlOiBhc2VxbmV0IFstb3B0aW9uc11cbiIpKTsKKwlwcmludGYoXygiICBjbGllbnQgbW9kZTogYXNlcW5ldCBbLW9wdGlvbnNdIHNlcnZlcl9ob3N0XG4iKSk7CisJcHJpbnRmKF8oIm9wdGlvbnM6XG4iKSk7CisJcHJpbnRmKF8oIiAgLXAsLS1wb3J0ICMgOiBzZXBjaWZ5IFRDUCBwb3J0IChkaWdpdCBvciBzZXJ2aWNlIG5hbWUpXG4iKSk7CisJcHJpbnRmKF8oIiAgLXMsLS1zb3VyY2UgYWRkciA6IHJlYWQgZnJvbSBnaXZlbiBhZGRyIChjbGllbnQ6cG9ydClcbiIpKTsKKwlwcmludGYoXygiICAtZCwtLWRlc3QgYWRkciA6IHdyaXRlIHRvIGdpdmVuIGFkZHIgKGNsaWVudDpwb3J0KVxuIikpOworCXByaW50ZihfKCIgIC12LCAtLXZlcmJvc2UgOiBwcmludCB2ZXJib3NlIG1lc3NhZ2VzXG4iKSk7CisJcHJpbnRmKF8oIiAgLWksIC0taW5mbyA6IHByaW50IGNlcnRhaW4gcmVjZWl2ZWQgZXZlbnRzXG4iKSk7Cit9CisKKworLyoKKyAqIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGJ1ZmZlcnMKKyAqLworc3RhdGljIHZvaWQgaW5pdF9idWYodm9pZCkKK3sKKwltYXhfd3JsZW4gPSBNQVhfQlVGX0VWRU5UUyAqIHNpemVvZihzbmRfc2VxX2V2ZW50X3QpOworCW1heF9yZGxlbiA9IE1BWF9CVUZfRVZFTlRTICogc2l6ZW9mKHNuZF9zZXFfZXZlbnRfdCk7CisJd3JpdGVidWYgPSBtYWxsb2MobWF4X3dybGVuKTsKKwlyZWFkYnVmID0gbWFsbG9jKG1heF9yZGxlbik7CisJaWYgKHdyaXRlYnVmID09IE5VTEwgfHwgcmVhZGJ1ZiA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCBfKCJjYW4ndCBtYWxsb2NcbiIpKTsKKwkJZXhpdCgxKTsKKwl9CisJbWVtc2V0KHdyaXRlYnVmLCAwLCBtYXhfd3JsZW4pOworCW1lbXNldChyZWFkYnVmLCAwLCBtYXhfcmRsZW4pOworCWN1cl93cmxlbiA9IDA7Cit9CisKKy8qCisgKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBwb2xsIGFycmF5CisgKi8KK3N0YXRpYyB2b2lkIGluaXRfcG9sbGZkcyh2b2lkKQoreworCXBvbGxmZHNfY291bnQgPSBzZXFpZmRzX2NvdW50ICsgc2Vxb2Zkc19jb3VudCArIDEgKyBtYXhfY29ubmVjdGlvbjsKKwlwb2xsZmRzID0gKHN0cnVjdCBwb2xsZmQgKiljYWxsb2MocG9sbGZkc19jb3VudCwgc2l6ZW9mKHN0cnVjdCBwb2xsZmQpKTsKKwlhc3NlcnQocG9sbGZkcyk7Cit9CisKKy8qCisgKiBjbG9zZSBhbGwgZmlsZXMKKyAqLworc3RhdGljIHZvaWQgY2xvc2VfZmlsZXModm9pZCkKK3sKKwlpbnQgaTsKKwlpZiAodmVyYm9zZSkKKwkJZnByaW50ZihzdGRlcnIsIF8oImNsb3NpbmcgZmlsZXMuLlxuIikpOworCWZvciAoaSA9IDA7IGkgPCBtYXhfY29ubmVjdGlvbjsgaSsrKSB7CisJCWlmIChuZXRmZFtpXSA+PSAwKQorCQkJY2xvc2UobmV0ZmRbaV0pOworCX0KKwlpZiAoc29ja2ZkID49IDApCisJCWNsb3NlKHNvY2tmZCk7Cit9CisKKworLyoKKyAqIGluaXRpYWxpemUgc2VxdWVuY2VyCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfc2VxKGNoYXIgKnNvdXJjZSwgY2hhciAqZGVzdCkKK3sKKwlzbmRfc2VxX2FkZHJfdCBhZGRyOworCWludCBlcnIsIGNvdW50aSwgY291bnRvOworCisJaWYgKHNuZF9zZXFfb3BlbigmaGFuZGxlLCAiZGVmYXVsdCIsIFNORF9TRVFfT1BFTl9EVVBMRVgsIDApIDwgMCkgeworCQlwZXJyb3IoInNuZF9zZXFfb3BlbiIpOworCQlleGl0KDEpOworCX0KKwlpZiAoc2VxaWZkcykKKwkJZnJlZShzZXFpZmRzKTsKKwlpZiAoc2Vxb2ZkcykKKwkJZnJlZShzZXFvZmRzKTsKKwljb3VudGkgPSBzZXFpZmRzX2NvdW50ID0gc25kX3NlcV9wb2xsX2Rlc2NyaXB0b3JzX2NvdW50KGhhbmRsZSwgUE9MTElOKTsKKwlhc3NlcnQoY291bnRpID4gMCk7CisJY291bnRvID0gc2Vxb2Zkc19jb3VudCA9IHNuZF9zZXFfcG9sbF9kZXNjcmlwdG9yc19jb3VudChoYW5kbGUsIFBPTExPVVQpOworCWFzc2VydChjb3VudG8gPiAwKTsKKwlzZXFpZmRzID0gKHN0cnVjdCBwb2xsZmQgKiljYWxsb2MoY291bnRpLCBzaXplb2Yoc3RydWN0IHBvbGxmZCkpOworCWFzc2VydChzZXFpZmRzKTsKKwlzZXFvZmRzID0gKHN0cnVjdCBwb2xsZmQgKiljYWxsb2MoY291bnRvLCBzaXplb2Yoc3RydWN0IHBvbGxmZCkpOworCWFzc2VydChzZXFvZmRzKTsKKwllcnIgPSBzbmRfc2VxX3BvbGxfZGVzY3JpcHRvcnMoaGFuZGxlLCBzZXFpZmRzLCBjb3VudGksIFBPTExJTik7CisJYXNzZXJ0KGVyciA9PSBjb3VudGkpOworCWVyciA9IHNuZF9zZXFfcG9sbF9kZXNjcmlwdG9ycyhoYW5kbGUsIHNlcW9mZHMsIGNvdW50bywgUE9MTE9VVCk7CisJYXNzZXJ0KGVyciA9PSBjb3VudG8pOworCisJc25kX3NlcV9ub25ibG9jayhoYW5kbGUsIDEpOworCisJLyogc2V0IGNsaWVudCBpbmZvICovCisJaWYgKHNlcnZlcl9tb2RlKQorCQlzbmRfc2VxX3NldF9jbGllbnRfbmFtZShoYW5kbGUsICJOZXQgU2VydmVyIik7CisJZWxzZQorCQlzbmRfc2VxX3NldF9jbGllbnRfbmFtZShoYW5kbGUsICJOZXQgQ2xpZW50Iik7CisKKwkvKiBjcmVhdGUgYSBwb3J0ICovCisJc2VxX3BvcnQgPSBzbmRfc2VxX2NyZWF0ZV9zaW1wbGVfcG9ydChoYW5kbGUsICJOZXR3b3JrIiwKKwkJCQkJICAgICAgU05EX1NFUV9QT1JUX0NBUF9SRUFEIHwKKwkJCQkJICAgICAgU05EX1NFUV9QT1JUX0NBUF9XUklURSB8CisJCQkJCSAgICAgIFNORF9TRVFfUE9SVF9DQVBfU1VCU19SRUFEIHwKKwkJCQkJICAgICAgU05EX1NFUV9QT1JUX0NBUF9TVUJTX1dSSVRFLAorCQkJCQkgICAgICBTTkRfU0VRX1BPUlRfVFlQRV9NSURJX0dFTkVSSUMpOworCWlmIChzZXFfcG9ydCA8IDApIHsKKwkJcGVycm9yKCJjcmVhdGUgc2VxIHBvcnQiKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKHZlcmJvc2UpCisJCWZwcmludGYoc3RkZXJyLCBfKCJzZXF1ZW5jZXIgb3BlbmVkOiAlZDolZFxuIiksCisJCQlzbmRfc2VxX2NsaWVudF9pZChoYW5kbGUpLCBzZXFfcG9ydCk7CisKKwkvKiBleHBsaWNpdCBzdWJzY3JpcHRpb25zICovCisJaWYgKHNvdXJjZSkgeworCQkvKiByZWFkIHN1YnNjcmlwdGlvbiAqLworCQlpZiAoc25kX3NlcV9wYXJzZV9hZGRyZXNzKGhhbmRsZSwgJmFkZHIsIHNvdXJjZSkgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgXygiaW52YWxpZCBzb3VyY2UgYWRkcmVzcyAlc1xuIiksIHNvdXJjZSk7CisJCQlleGl0KDEpOworCQl9CisJCWlmIChzbmRfc2VxX2Nvbm5lY3RfZnJvbShoYW5kbGUsIHNlcV9wb3J0LCBhZGRyLmNsaWVudCwgYWRkci5wb3J0KSkgeworCQkJcGVycm9yKCJyZWFkIHN1YnNjcmlwdGlvbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKwlpZiAoZGVzdCkgeworCQkvKiB3cml0ZSBzdWJzY3JpcHRpb24gKi8KKwkJaWYgKHNuZF9zZXFfcGFyc2VfYWRkcmVzcyhoYW5kbGUsICZhZGRyLCBkZXN0KSA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCBfKCJpbnZhbGlkIGRlc3RpbmF0aW9uIGFkZHJlc3MgJXNcbiIpLCBkZXN0KTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJaWYgKHNuZF9zZXFfY29ubmVjdF90byhoYW5kbGUsIHNlcV9wb3J0LCBhZGRyLmNsaWVudCwgYWRkci5wb3J0KSkgeworCQkJcGVycm9yKCJ3cml0ZSBzdWJzY3JpcHRpb24iKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9Cit9CisKKworLyoKKyAqIGNvbnZlcnQgZnJvbSBzdHJpbmcgdG8gVENQIHBvcnQgbnVtYmVyCisgKi8KK3N0YXRpYyBpbnQgZ2V0X3BvcnQoY2hhciAqc2VydmljZSkKK3sKKwlzdHJ1Y3Qgc2VydmVudCAqc3A7CisKKwlpZiAoKHNwID0gZ2V0c2VydmJ5bmFtZShzZXJ2aWNlLCAidGNwIikpID09IE5VTEwpeworCQlmcHJpbnRmKHN0ZGVyciwgXygic2VydmljZSAnJXMnIGlzIG5vdCBmb3VuZCBpbiAvZXRjL3NlcnZpY2VzXG4iKSwgc2VydmljZSk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIHNwLT5zX3BvcnQ7Cit9CisKKy8qCisgKiBzaWduYWwgaGFuZGxlcgorICovCitzdGF0aWMgdm9pZCBzaWd0ZXJtX2V4aXQoaW50IHNpZykKK3sKKwljbG9zZV9maWxlcygpOworCWV4aXQoMSk7Cit9CisKKworLyoKKyAqIGluaXRpYWxpemUgbmV0d29yayBzZXJ2ZXIKKyAqLworc3RhdGljIHZvaWQgaW5pdF9zZXJ2ZXIoaW50IHBvcnQpCit7CisJaW50IGk7CisJaW50IGN1cnN0YXRlID0gMTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKworCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKworCWFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJYWRkci5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworCWFkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKworCXNvY2tmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisJaWYgKHNvY2tmZCA8IDApICB7CisJCXBlcnJvcigiY3JlYXRlIHNvY2tldCIpOworCQlleGl0KDEpOworCX0KKwlzZXRzb2Nrb3B0KHNvY2tmZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmY3Vyc3RhdGUsIHNpemVvZihjdXJzdGF0ZSkpOworCS8qIHRoZSByZXR1cm4gdmFsdWUgaXMgaWdub3JlZC4uICovCisKKwlpZiAoYmluZChzb2NrZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpKSA8IDApICB7CisJCXBlcnJvcigiY2FuJ3QgYmluZCIpOworCQlleGl0KDEpOworCX0KKworCWlmIChsaXN0ZW4oc29ja2ZkLCA1KSA8IDApICB7CisJCXBlcnJvcigiY2FuJ3QgbGlzdGVuIik7CisJCWV4aXQoMSk7CisJfQorCisJY3VyX2Nvbm5lY3RlZCA9IDA7CisJZm9yIChpID0gMDsgaSA8IG1heF9jb25uZWN0aW9uOyBpKyspCisJCW5ldGZkW2ldID0gLTE7Cit9CisKKy8qCisgKiBzdGFydCBjb25uZWN0aW9uIG9uIHNlcnZlcgorICovCitzdGF0aWMgdm9pZCBzdGFydF9jb25uZWN0aW9uKHZvaWQpCit7CisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisJaW50IGk7CisJc29ja2xlbl90IGFkZHJfbGVuOworCisJZm9yIChpID0gMDsgaSA8IG1heF9jb25uZWN0aW9uOyBpKyspIHsKKwkJaWYgKG5ldGZkW2ldIDwgMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA+PSBtYXhfY29ubmVjdGlvbikgeworCQlmcHJpbnRmKHN0ZGVyciwgXygidG9vIG1hbnkgY29ubmVjdGlvbnMhXG4iKSk7CisJCWV4aXQoMSk7CisJfQorCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKwlhZGRyX2xlbiA9IHNpemVvZihhZGRyKTsKKwluZXRmZFtpXSA9IGFjY2VwdChzb2NrZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgJmFkZHJfbGVuKTsKKwlpZiAobmV0ZmRbaV0gPCAwKSB7CisJCXBlcnJvcigiYWNjZXB0Iik7CisJCWV4aXQoMSk7CisJfQorCWlmICh2ZXJib3NlKQorCQlmcHJpbnRmKHN0ZGVyciwgXygiYWNjZXB0ZWRbJWRdXG4iKSwgbmV0ZmRbaV0pOworCWN1cl9jb25uZWN0ZWQrKzsKK30KKworLyoKKyAqIGluaXRpYWxpemUgbmV0d29yayBjbGllbnQKKyAqLworc3RhdGljIHZvaWQgaW5pdF9jbGllbnQoY2hhciAqc2VydmVyLCBpbnQgcG9ydCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwlzdHJ1Y3QgaG9zdGVudCAqaG9zdDsKKwlpbnQgY3Vyc3RhdGUgPSAxOworCWludCBmZDsKKworCWlmICgoZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKSkgPCAwKXsKKwkJcGVycm9yKCJjcmVhdGUgc29ja2V0Iik7CisJCWV4aXQoMSk7CisJfQorCWlmIChzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZjdXJzdGF0ZSwgc2l6ZW9mKGN1cnN0YXRlKSkgPCAwKSB7CisJCXBlcnJvcigic2V0c29ja29wdCIpOworCQlleGl0KDEpOworCX0KKwlpZiAoKGhvc3QgPSBnZXRob3N0YnluYW1lKHNlcnZlcikpID09IE5VTEwpeworCQlmcHJpbnRmKHN0ZGVyciwgXygiY2FuJ3QgZ2V0IGFkZHJlc3MgJXNcbiIpLCBzZXJ2ZXIpOworCQlleGl0KDEpOworCX0KKwlhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisJYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwltZW1jcHkoJmFkZHIuc2luX2FkZHIsIGhvc3QtPmhfYWRkciwgaG9zdC0+aF9sZW5ndGgpOworCWlmIChjb25uZWN0KGZkLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKSB7CisJCXBlcnJvcigiY29ubmVjdCIpOworCQlleGl0KDEpOworCX0KKwlpZiAodmVyYm9zZSkKKwkJZnByaW50ZihzdGRlcnIsIF8oIm9rLi4gY29ubmVjdGVkXG4iKSk7CisJbmV0ZmRbMF0gPSBmZDsKKwljdXJfY29ubmVjdGVkID0gMTsKK30KKworLyoKKyAqIGV2ZW50IGxvb3AKKyAqLworc3RhdGljIHZvaWQgZG9fbG9vcCh2b2lkKQoreworCWludCBpLCByYywgd2lkdGg7CisJaW50IHNlcWlmZF9wdHIsIHNvY2tmZF9wdHIgPSAtMSwgbmV0ZmRfcHRyOworCisJZm9yICg7OykgeworCQltZW1zZXQocG9sbGZkcywgMCwgcG9sbGZkc19jb3VudCAqIHNpemVvZihzdHJ1Y3QgcG9sbGZkKSk7CisJCXNlcWlmZF9wdHIgPSAwOworCQltZW1jcHkocG9sbGZkcywgc2VxaWZkcywgc2l6ZW9mKCpzZXFpZmRzKSood2lkdGggPSBzZXFpZmRzX2NvdW50KSk7CisJCWlmIChzZXJ2ZXJfbW9kZSkgeworCQkJc29ja2ZkX3B0ciA9IHdpZHRoOworCQkJcG9sbGZkc1t3aWR0aF0uZmQgPSBzb2NrZmQ7CisJCQlwb2xsZmRzW3dpZHRoXS5ldmVudHMgPSBQT0xMSU47CisJCQl3aWR0aCsrOworCQl9CisJCW5ldGZkX3B0ciA9IHdpZHRoOworCQlmb3IgKGkgPSAwOyBpIDwgbWF4X2Nvbm5lY3Rpb247IGkrKykgeworCQkJaWYgKG5ldGZkW2ldID49IDApIHsKKwkJCQlwb2xsZmRzW3dpZHRoXS5mZCA9IG5ldGZkW2ldOworCQkJCXBvbGxmZHNbd2lkdGhdLmV2ZW50cyA9IFBPTExJTjsKKwkJCQl3aWR0aCsrOworCQkJfQorCQl9CisJCWRvIHsKKwkJCXJjID0gcG9sbChwb2xsZmRzLCB3aWR0aCwgLTEpOworCQl9IHdoaWxlIChyYyA8PSAwICYmIGVycm5vID09IEVJTlRSKTsKKwkJaWYgKHJjIDw9IDApIHsKKwkJCXBlcnJvcigicG9sbCIpOworCQkJZXhpdCgxKTsKKwkJfQorCQlpZiAoc2VydmVyX21vZGUpIHsKKwkJCWlmIChwb2xsZmRzW3NvY2tmZF9wdHJdLnJldmVudHMgJiAoUE9MTElOfFBPTExPVVQpKQorCQkJCXN0YXJ0X2Nvbm5lY3Rpb24oKTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgc2VxaWZkc19jb3VudDsgaSsrKQorCQkJaWYgKHBvbGxmZHNbc2VxaWZkX3B0ciArIGldLnJldmVudHMgJiAoUE9MTElOfFBPTExPVVQpKSB7CisJCQkJaWYgKGNvcHlfbG9jYWxfdG9fcmVtb3RlKCkpCisJCQkJCXJldHVybjsKKwkJCQlicmVhazsKKwkJCX0KKwkJZm9yIChpID0gMDsgaSA8IG1heF9jb25uZWN0aW9uOyBpKyspIHsKKwkJCWlmIChuZXRmZFtpXSA8IDApCisJCQkJY29udGludWU7CisJCQlpZiAocG9sbGZkc1tuZXRmZF9wdHIgKyBpXS5yZXZlbnRzICYgKFBPTExJTnxQT0xMT1VUKSkgeworCQkJCWlmIChjb3B5X3JlbW90ZV90b19sb2NhbChuZXRmZFtpXSkpIHsKKwkJCQkJbmV0ZmRbaV0gPSAtMTsKKwkJCQkJY3VyX2Nvbm5lY3RlZC0tOworCQkJCQlpZiAoY3VyX2Nvbm5lY3RlZCA8PSAwKQorCQkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworCisvKgorICogZmx1c2ggd3JpdGUgYnVmZmVyIC0gc2VuZCBkYXRhIHRvIHRoZSBzb2NrZXQKKyAqLworc3RhdGljIHZvaWQgZmx1c2hfd3JpdGVidWYodm9pZCkKK3sKKwlpZiAoY3VyX3dybGVuKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgbWF4X2Nvbm5lY3Rpb247IGkrKykgeworCQkJaWYgKG5ldGZkW2ldID49IDApCisJCQkJd3JpdGUobmV0ZmRbaV0sIHdyaXRlYnVmLCBjdXJfd3JsZW4pOworCQl9CisJCWN1cl93cmxlbiA9IDA7CisJfQorfQorCisvKgorICogZ2V0IHNwYWNlIGZyb20gd3JpdGUgYnVmZmVyCisgKi8KK3N0YXRpYyBjaGFyICpnZXRfd3JpdGVidWYoaW50IGxlbikKK3sKKwljaGFyICpidWY7CisJaWYgKGN1cl93cmxlbiArIGxlbiA+PSBtYXhfd3JsZW4pCisJCWZsdXNoX3dyaXRlYnVmKCk7CisJYnVmID0gd3JpdGVidWYgKyBjdXJfd3JsZW47CisJY3VyX3dybGVuICs9IGxlbjsKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgdm9pZCBwcmludF9ldmVudChzbmRfc2VxX2V2ZW50X3QgKmV2KQoreworCXN3aXRjaCAoZXYtPnR5cGUpIHsKKwljYXNlIFNORF9TRVFfRVZFTlRfQ09OVFJPTExFUjogCisJCXByaW50ZihfKCJDaGFubmVsICUyZDogQ29udHJvbCBldmVudCA6ICU1ZFxuIiksCisJCQlldi0+ZGF0YS5jb250cm9sLmNoYW5uZWwsIGV2LT5kYXRhLmNvbnRyb2wudmFsdWUpOworCQlicmVhazsKKwljYXNlIFNORF9TRVFfRVZFTlRfUElUQ0hCRU5EOgorCQlwcmludGYoXygiQ2hhbm5lbCAlMmQ6IFBpdGNoYmVuZGVyICAgOiAlNWRcbiIpLCAKKwkJCWV2LT5kYXRhLmNvbnRyb2wuY2hhbm5lbCwgZXYtPmRhdGEuY29udHJvbC52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgU05EX1NFUV9FVkVOVF9OT1RFT046CisJCXByaW50ZihfKCJDaGFubmVsICUyZDogTm90ZSBPbiBldmVudCA6ICU1ZFxuIiksCisJCQlldi0+ZGF0YS5jb250cm9sLmNoYW5uZWwsIGV2LT5kYXRhLm5vdGUubm90ZSk7CisJCWJyZWFrOworCWNhc2UgU05EX1NFUV9FVkVOVF9OT1RFT0ZGOiAKKwkJcHJpbnRmKF8oIkNoYW5uZWwgJTJkOiBOb3RlIE9mZiBldmVudDogJTVkXG4iKSwKKwkJICAgICAgIGV2LT5kYXRhLmNvbnRyb2wuY2hhbm5lbCwgZXYtPmRhdGEubm90ZS5ub3RlKTsgICAgICAgICAgIAorCQlicmVhazsKKwl9Cit9CisKKyNkZWZpbmUgRVZFTlRfUEFDS0VUX1NJWkUJMzIKKworLyoKKyAqIGNvcHkgZXZlbnRzIGZyb20gc2VxdWVuY2VyIHRvIHBvcnQocykKKyAqLworc3RhdGljIGludCBjb3B5X2xvY2FsX3RvX3JlbW90ZSh2b2lkKQoreworCWludCByYzsKKwlzbmRfc2VxX2V2ZW50X3QgKmV2OworCWNoYXIgKmJ1ZjsKKworCXdoaWxlICgocmMgPSBzbmRfc2VxX2V2ZW50X2lucHV0KGhhbmRsZSwgJmV2KSkgPj0gMCAmJiBldikgeworCQlpZiAoZXYtPnR5cGUgPj0gU05EX1NFUV9FVkVOVF9DTElFTlRfU1RBUlQgJiYKKwkJICAgICEgc25kX3NlcV9ldl9pc192YXJpYWJsZV90eXBlKGV2KSkgeworCQkJc25kX3NlcV9mcmVlX2V2ZW50KGV2KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzbmRfc2VxX2V2X2lzX3ZhcmlhYmxlKGV2KSkgeworCQkJaW50IGxlbjsKKwkJCWxlbiA9IEVWRU5UX1BBQ0tFVF9TSVpFICsgZXYtPmRhdGEuZXh0LmxlbjsKKwkJCWJ1ZiA9IGdldF93cml0ZWJ1ZihsZW4pOworCQkJbWVtY3B5KGJ1ZiwgZXYsIHNpemVvZihzbmRfc2VxX2V2ZW50X3QpKTsKKwkJCW1lbWNweShidWYgKyBFVkVOVF9QQUNLRVRfU0laRSwgZXYtPmRhdGEuZXh0LnB0ciwgZXYtPmRhdGEuZXh0Lmxlbik7CisJCX0gZWxzZSB7CisJCQlidWYgPSBnZXRfd3JpdGVidWYoRVZFTlRfUEFDS0VUX1NJWkUpOworCQkJbWVtY3B5KGJ1ZiwgZXYsIEVWRU5UX1BBQ0tFVF9TSVpFKTsKKwkJfQorCQlpZiAoaW5mbykKKwkJCXByaW50X2V2ZW50KGV2KTsKKwkJc25kX3NlcV9mcmVlX2V2ZW50KGV2KTsKKwl9CisJZmx1c2hfd3JpdGVidWYoKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNvcHkgZXZlbnRzIGZyb20gYSBwb3J0IHRvIHNlcXVlbmNlcgorICovCitzdGF0aWMgaW50IGNvcHlfcmVtb3RlX3RvX2xvY2FsKGludCBmZCkKK3sKKwlpbnQgY291bnQ7CisJY2hhciAqYnVmOworCXNuZF9zZXFfZXZlbnRfdCAqZXY7CisKKwljb3VudCA9IHJlYWQoZmQsIHJlYWRidWYsIE1BWF9CVUZfRVZFTlRTICogc2l6ZW9mKHNuZF9zZXFfZXZlbnRfdCkpOworCWJ1ZiA9IHJlYWRidWY7CisKKwlpZiAoY291bnQgPT0gMCkgeworCQlpZiAodmVyYm9zZSkKKwkJCWZwcmludGYoc3RkZXJyLCBfKCJkaXNjb25uZWN0ZWRcbiIpKTsKKwkJcmV0dXJuIDE7CisJfQorCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlldiA9IChzbmRfc2VxX2V2ZW50X3QqKWJ1ZjsKKwkJYnVmICs9IEVWRU5UX1BBQ0tFVF9TSVpFOworCQljb3VudCAtPSBFVkVOVF9QQUNLRVRfU0laRTsKKwkJaWYgKHNuZF9zZXFfZXZfaXNfdmFyaWFibGUoZXYpICYmIGV2LT5kYXRhLmV4dC5sZW4gPiAwKSB7CisJCQlldi0+ZGF0YS5leHQucHRyID0gYnVmOworCQkJYnVmICs9IGV2LT5kYXRhLmV4dC5sZW47CisJCQljb3VudCAtPSBldi0+ZGF0YS5leHQubGVuOworCQl9CisJCXNuZF9zZXFfZXZfc2V0X2RpcmVjdChldik7CisJCXNuZF9zZXFfZXZfc2V0X3NvdXJjZShldiwgc2VxX3BvcnQpOworCQlzbmRfc2VxX2V2X3NldF9zdWJzKGV2KTsKKwkJaWYgKGluZm8pCisJCQlwcmludF9ldmVudChldik7CisJCXNuZF9zZXFfZXZlbnRfb3V0cHV0KGhhbmRsZSwgZXYpOworCX0KKworCXNuZF9zZXFfZHJhaW5fb3V0cHV0KGhhbmRsZSk7CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3NwZWFrZXItdGVzdC9NYWtlZmlsZS5hbSBiL3NwZWFrZXItdGVzdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzU1MWJjCi0tLSAvZGV2L251bGwKKysrIGIvc3BlYWtlci10ZXN0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsOSBAQAorSU5DTFVERVMgPSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorU1VCRElSUz0gc2FtcGxlcworTERBREQgPSAkKExJQklOVEwpIC1sbQorCitiaW5fUFJPR1JBTVMgPSBzcGVha2VyLXRlc3QKK3NwZWFrZXJfdGVzdF9TT1VSQ0VTID0gc3BlYWtlci10ZXN0LmMgcGluay5jCittYW5fTUFOUyA9IHNwZWFrZXItdGVzdC4xCitFWFRSQV9ESVNUID0gcmVhZG1lLnR4dCBzcGVha2VyLXRlc3QuMSBwaW5rLmgKKwpkaWZmIC0tZ2l0IGEvc3BlYWtlci10ZXN0L3BpbmsuYyBiL3NwZWFrZXItdGVzdC9waW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYzMDc1NQotLS0gL2Rldi9udWxsCisrKyBiL3NwZWFrZXItdGVzdC9waW5rLmMKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAgcGF0ZXN0X3BpbmsuYworCisgIGdlbmVyYXRlIFBpbmsgTm9pc2UgdXNpbmcgR2FyZG5lciBtZXRob2QuCisgIE9wdGltaXphdGlvbiBzdWdnZXN0ZWQgYnkgSmFtZXMgTWNDYXJ0bmV5IHVzZXMgYSB0cmVlCisgIHRvIHNlbGVjdCB3aGljaCByYW5kb20gdmFsdWUgdG8gcmVwbGFjZS4KKworICB4IHggeCB4IHggeCB4IHggeCB4IHggeCB4IHggeCB4IAorICB4ICAgeCAgIHggICB4ICAgeCAgIHggICB4ICAgeCAgIAorICB4ICAgICAgIHggICAgICAgeCAgICAgICB4ICAgICAgIAorICB4ICAgICAgICAgICAgICAgeCAgICAgICAgICAgICAgIAorICB4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIFRyZWUgaXMgZ2VuZXJhdGVkIGJ5IGNvdW50aW5nIHRyYWlsaW5nIHplcm9zIGluIGFuIGluY3JlYXNpbmcgaW5kZXguCisgIFdoZW4gdGhlIGluZGV4IGlzIHplcm8sIG5vIHJhbmRvbSBudW1iZXIgaXMgc2VsZWN0ZWQuCisKKyAgVGhpcyBwcm9ncmFtIHVzZXMgdGhlIFBvcnRhYmxlIEF1ZGlvIGxpYnJhcnkgd2hpY2ggaXMgdW5kZXIgZGV2ZWxvcG1lbnQuCisgIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZTogICBodHRwOi8vd3d3LmF1ZGlvbXVsY2guY29tL3BvcnRhdWRpby8KKworICBBdXRob3I6IFBoaWwgQnVyaywgaHR0cDovL3d3dy5zb2Z0c3ludGguY29tCisJCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgQ29weWxlZnQgMTk5OSBQaGlsIEJ1cmsgLSBObyByaWdodHMgcmVzZXJ2ZWQuCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAicGluay5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQ2FsY3VsYXRlIHBzZXVkby1yYW5kb20gMzIgYml0IG51bWJlciBiYXNlZCBvbiBsaW5lYXIgY29uZ3J1ZW50aWFsIG1ldGhvZC4gKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdlbmVyYXRlX3JhbmRvbV9udW1iZXIoIHZvaWQgKQoreworICAgIHN0YXRpYyB1bnNpZ25lZCBsb25nIHJhbmRfc2VlZCA9IDIyMjIyOyAgLyogQ2hhbmdlIHRoaXMgZm9yIGRpZmZlcmVudCByYW5kb20gc2VxdWVuY2VzLiAqLworICAgIHJhbmRfc2VlZCA9IChyYW5kX3NlZWQgKiAxOTYzMTQxNjUpICsgOTA3NjMzNTE1OworICAgIHJldHVybiByYW5kX3NlZWQ7Cit9CisKKy8qIFNldHVwIFBpbmtOb2lzZSBzdHJ1Y3R1cmUgZm9yIE4gcm93cyBvZiBnZW5lcmF0b3JzLiAqLwordm9pZCBpbml0aWFsaXplX3Bpbmtfbm9pc2UoIHBpbmtfbm9pc2VfdCAqcGluaywgaW50IG51bV9yb3dzICkKK3sKKyAgICBpbnQgaTsKKyAgICBsb25nIHBtYXg7CisgICAgcGluay0+cGlua19pbmRleCA9IDA7CisgICAgcGluay0+cGlua19pbmRleF9tYXNrID0gKDE8PG51bV9yb3dzKSAtIDE7CisvKiBDYWxjdWxhdGUgbWF4aW11bSBwb3NzaWJsZSBzaWduZWQgcmFuZG9tIHZhbHVlLiBFeHRyYSAxIGZvciB3aGl0ZSBub2lzZSBhbHdheXMgYWRkZWQuICovCisgICAgcG1heCA9IChudW1fcm93cyArIDEpICogKDE8PChQSU5LX1JBTkRPTV9CSVRTLTEpKTsKKyAgICBwaW5rLT5waW5rX3NjYWxhciA9IDEuMGYgLyBwbWF4OworLyogSW5pdGlhbGl6ZSByb3dzLiAqLworICAgIGZvciggaT0wOyBpPG51bV9yb3dzOyBpKysgKSBwaW5rLT5waW5rX3Jvd3NbaV0gPSAwOworICAgIHBpbmstPnBpbmtfcnVubmluZ19zdW0gPSAwOworfQorCisvKiBnZW5lcmF0ZSBQaW5rIG5vaXNlIHZhbHVlcyBiZXR3ZWVuIC0xLjAgYW5kICsxLjAgKi8KK2Zsb2F0IGdlbmVyYXRlX3Bpbmtfbm9pc2Vfc2FtcGxlKCBwaW5rX25vaXNlX3QgKnBpbmsgKQoreworICAgIGxvbmcgbmV3X3JhbmRvbTsKKyAgICBsb25nIHN1bTsKKyAgICBmbG9hdCBvdXRwdXQ7CisKKy8qIEluY3JlbWVudCBhbmQgbWFzayBpbmRleC4gKi8KKyAgICBwaW5rLT5waW5rX2luZGV4ID0gKHBpbmstPnBpbmtfaW5kZXggKyAxKSAmIHBpbmstPnBpbmtfaW5kZXhfbWFzazsKKworLyogSWYgaW5kZXggaXMgemVybywgZG9uJ3QgdXBkYXRlIGFueSByYW5kb20gdmFsdWVzLiAqLworICAgIGlmKCBwaW5rLT5waW5rX2luZGV4ICE9IDAgKQorICAgIHsKKwkvKiBEZXRlcm1pbmUgaG93IG1hbnkgdHJhaWxpbmcgemVyb3MgaW4gUGlua0luZGV4LiAqLworCS8qIFRoaXMgYWxnb3JpdGhtIHdpbGwgaGFuZyBpZiBuPT0wIHNvIHRlc3QgZmlyc3QuICovCisJaW50IG51bV96ZXJvcyA9IDA7CisJaW50IG4gPSBwaW5rLT5waW5rX2luZGV4OworCXdoaWxlKCAobiAmIDEpID09IDAgKQorCXsKKwkgICAgbiA9IG4gPj4gMTsKKwkgICAgbnVtX3plcm9zKys7CisJfQorCisJLyogUmVwbGFjZSB0aGUgaW5kZXhlZCBST1dTIHJhbmRvbSB2YWx1ZS4KKwkgKiBTdWJ0cmFjdCBhbmQgYWRkIGJhY2sgdG8gUnVubmluZ19zdW0gaW5zdGVhZCBvZiBhZGRpbmcgYWxsIHRoZSByYW5kb20KKwkgKiB2YWx1ZXMgdG9nZXRoZXIuIE9ubHkgb25lIGNoYW5nZXMgZWFjaCB0aW1lLgorCSAqLworCXBpbmstPnBpbmtfcnVubmluZ19zdW0gLT0gcGluay0+cGlua19yb3dzW251bV96ZXJvc107CisJbmV3X3JhbmRvbSA9ICgobG9uZylnZW5lcmF0ZV9yYW5kb21fbnVtYmVyKCkpID4+IFBJTktfUkFORE9NX1NISUZUOworCXBpbmstPnBpbmtfcnVubmluZ19zdW0gKz0gbmV3X3JhbmRvbTsKKwlwaW5rLT5waW5rX3Jvd3NbbnVtX3plcm9zXSA9IG5ld19yYW5kb207CisgICAgfQorCQorLyogQWRkIGV4dHJhIHdoaXRlIG5vaXNlIHZhbHVlLiAqLworICAgIG5ld19yYW5kb20gPSAoKGxvbmcpZ2VuZXJhdGVfcmFuZG9tX251bWJlcigpKSA+PiBQSU5LX1JBTkRPTV9TSElGVDsKKyAgICBzdW0gPSBwaW5rLT5waW5rX3J1bm5pbmdfc3VtICsgbmV3X3JhbmRvbTsKKworLyogU2NhbGUgdG8gcmFuZ2Ugb2YgLTEuMCB0byAwLjk5OTkuICovCisgICAgb3V0cHV0ID0gcGluay0+cGlua19zY2FsYXIgKiBzdW07CisKKyAgICByZXR1cm4gb3V0cHV0OworfQpkaWZmIC0tZ2l0IGEvc3BlYWtlci10ZXN0L3BpbmsuaCBiL3NwZWFrZXItdGVzdC9waW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQxN2Y3YQotLS0gL2Rldi9udWxsCisrKyBiL3NwZWFrZXItdGVzdC9waW5rLmgKQEAgLTAsMCArMSwxNSBAQAorI2RlZmluZSBQSU5LX01BWF9SQU5ET01fUk9XUyAgICgzMCkKKyNkZWZpbmUgUElOS19SQU5ET01fQklUUyAgICAgICAoMjQpCisjZGVmaW5lIFBJTktfUkFORE9NX1NISUZUICAgICAgKChzaXplb2YobG9uZykqOCktUElOS19SQU5ET01fQklUUykKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgbG9uZyAgICAgIHBpbmtfcm93c1tQSU5LX01BWF9SQU5ET01fUk9XU107CisgIGxvbmcgICAgICBwaW5rX3J1bm5pbmdfc3VtOyAgIC8qIFVzZWQgdG8gb3B0aW1pemUgc3VtbWluZyBvZiBnZW5lcmF0b3JzLiAqLworICBpbnQgICAgICAgcGlua19pbmRleDsgICAgICAgIC8qIEluY3JlbWVudGVkIGVhY2ggc2FtcGxlLiAqLworICBpbnQgICAgICAgcGlua19pbmRleF9tYXNrOyAgICAvKiBJbmRleCB3cmFwcGVkIGJ5IEFORGluZyB3aXRoIHRoaXMgbWFzay4gKi8KKyAgZmxvYXQgICAgIHBpbmtfc2NhbGFyOyAgICAgICAvKiBVc2VkIHRvIHNjYWxlIHdpdGhpbiByYW5nZSBvZiAtMS4wIHRvICsxLjAgKi8KK30gcGlua19ub2lzZV90OworCit2b2lkIGluaXRpYWxpemVfcGlua19ub2lzZSggcGlua19ub2lzZV90ICpwaW5rLCBpbnQgbnVtX3Jvd3MgKTsKK2Zsb2F0IGdlbmVyYXRlX3Bpbmtfbm9pc2Vfc2FtcGxlKCBwaW5rX25vaXNlX3QgKnBpbmsgKTsKZGlmZiAtLWdpdCBhL3NwZWFrZXItdGVzdC9yZWFkbWUudHh0IGIvc3BlYWtlci10ZXN0L3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc3NGZlMAotLS0gL2Rldi9udWxsCisrKyBiL3NwZWFrZXItdGVzdC9yZWFkbWUudHh0CkBAIC0wLDAgKzEsMTIgQEAKK1RvIG1ha2Ugb3IgYnVpbGQganVzdCB0eXBlCisKK21ha2UKKworVG8gdGVzdDogLQorMSkgSnVzdCBzdGVyZW8gc291bmQgZnJvbSBvbmUgc3RlcmVvIGphY2s6IC0KKy4vc3BlYWtlci10ZXN0IC1EcGx1Zzpmcm9udCAtYzIKKzIpIEEgNCBzcGVha2VyIHNldHVwIGZyb20gdHdvIHN0ZXJlbyBqYWNrczogLQorLi9zcGVha2VyLXRlc3QgLURwbHVnOnN1cnJvdW5kNDAgLWM0CiszKSBBIDUuMSBzcGVha2VyIHNldHVwIGZyb20gdGhyZWUgc3RlcmVvIGphY2tzOiAtCisuL3NwZWFrZXItdGVzdCAtRHBsdWc6c3Vycm91bmQ1MSAtYzYKKwpkaWZmIC0tZ2l0IGEvc3BlYWtlci10ZXN0L3NhbXBsZXMvRnJvbnRfQ2VudGVyLndhdiBiL3NwZWFrZXItdGVzdC9zYW1wbGVzL0Zyb250X0NlbnRlci53YXYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYxMjE4MAotLS0gL2Rldi9udWxsCisrKyBiL3NwZWFrZXItdGVzdC9zYW1wbGVzL0Zyb250X0NlbnRlci53YXYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3BlYWtlci10ZXN0L3NhbXBsZXMvRnJvbnRfTGVmdC53YXYgYi9zcGVha2VyLXRlc3Qvc2FtcGxlcy9Gcm9udF9MZWZ0LndhdgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDZlYmRkCi0tLSAvZGV2L251bGwKKysrIGIvc3BlYWtlci10ZXN0L3NhbXBsZXMvRnJvbnRfTGVmdC53YXYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3BlYWtlci10ZXN0L3NhbXBsZXMvRnJvbnRfUmlnaHQud2F2IGIvc3BlYWtlci10ZXN0L3NhbXBsZXMvRnJvbnRfUmlnaHQud2F2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MTU2NWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcGVha2VyLXRlc3Qvc2FtcGxlcy9Gcm9udF9SaWdodC53YXYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3BlYWtlci10ZXN0L3NhbXBsZXMvTWFrZWZpbGUuYW0gYi9zcGVha2VyLXRlc3Qvc2FtcGxlcy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2MzNTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3BlYWtlci10ZXN0L3NhbXBsZXMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyMCBAQAorc291bmRkaXIgPSAkKGRhdGFkaXIpL3NvdW5kcy9hbHNhCit3YXZfZmlsZXMgPSBGcm9udF9MZWZ0LndhdiBcCisJUmVhcl9DZW50ZXIud2F2IFwKKwlSZWFyX1JpZ2h0LndhdiBcCisJU2lkZV9SaWdodC53YXYgXAorCUZyb250X0NlbnRlci53YXYgXAorCUZyb250X1JpZ2h0LndhdiBcCisJTm9pc2Uud2F2IFwKKwlSZWFyX0xlZnQud2F2IFwKKwlTaWRlX0xlZnQud2F2ICAKK3NvdW5kX0RBVEEgPSAkKHdhdl9maWxlcykKKworYWxzYWRpciA9ICQoZGF0YWRpcikvYWxzYS9zcGVha2VyLXRlc3QKK2NmZ19maWxlcyA9IHNhbXBsZV9tYXAuY3N2CisKK2Fsc2FfREFUQSA9ICQoY2ZnX2ZpbGVzKQorCitFWFRSQV9ESVNUID0gXAorCSQod2F2X2ZpbGVzKSBcCisJJChjZmdfZmlsZXMpCmRpZmYgLS1naXQgYS9zcGVha2VyLXRlc3Qvc2FtcGxlcy9Ob2lzZS53YXYgYi9zcGVha2VyLXRlc3Qvc2FtcGxlcy9Ob2lzZS53YXYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg5OGQzNAotLS0gL2Rldi9udWxsCisrKyBiL3NwZWFrZXItdGVzdC9zYW1wbGVzL05vaXNlLndhdgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcGVha2VyLXRlc3Qvc2FtcGxlcy9SZWFyX0NlbnRlci53YXYgYi9zcGVha2VyLXRlc3Qvc2FtcGxlcy9SZWFyX0NlbnRlci53YXYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyYzZkYQotLS0gL2Rldi9udWxsCisrKyBiL3NwZWFrZXItdGVzdC9zYW1wbGVzL1JlYXJfQ2VudGVyLndhdgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcGVha2VyLXRlc3Qvc2FtcGxlcy9SZWFyX0xlZnQud2F2IGIvc3BlYWtlci10ZXN0L3NhbXBsZXMvUmVhcl9MZWZ0LndhdgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2QwMzExCi0tLSAvZGV2L251bGwKKysrIGIvc3BlYWtlci10ZXN0L3NhbXBsZXMvUmVhcl9MZWZ0LndhdgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcGVha2VyLXRlc3Qvc2FtcGxlcy9SZWFyX1JpZ2h0LndhdiBiL3NwZWFrZXItdGVzdC9zYW1wbGVzL1JlYXJfUmlnaHQud2F2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MmU2NDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcGVha2VyLXRlc3Qvc2FtcGxlcy9SZWFyX1JpZ2h0LndhdgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcGVha2VyLXRlc3Qvc2FtcGxlcy9TaWRlX0xlZnQud2F2IGIvc3BlYWtlci10ZXN0L3NhbXBsZXMvU2lkZV9MZWZ0LndhdgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzQxZjJjCi0tLSAvZGV2L251bGwKKysrIGIvc3BlYWtlci10ZXN0L3NhbXBsZXMvU2lkZV9MZWZ0LndhdgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcGVha2VyLXRlc3Qvc2FtcGxlcy9TaWRlX1JpZ2h0LndhdiBiL3NwZWFrZXItdGVzdC9zYW1wbGVzL1NpZGVfUmlnaHQud2F2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZTViM2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcGVha2VyLXRlc3Qvc2FtcGxlcy9TaWRlX1JpZ2h0LndhdgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcGVha2VyLXRlc3Qvc2FtcGxlcy9zYW1wbGVfbWFwLmNzdiBiL3NwZWFrZXItdGVzdC9zYW1wbGVzL3NhbXBsZV9tYXAuY3N2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZDhlZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcGVha2VyLXRlc3Qvc2FtcGxlcy9zYW1wbGVfbWFwLmNzdgpAQCAtMCwwICsxLDIgQEAKKzAsICJGcm9udCBMZWZ0IiwgIi91c3Ivc2hhcmUvYWxzYS9zYW1wbGVzL0Zyb250X0xlZnQud2F2IgorMSwgIkZyb250IFJpZ2h0IiwgIi91c3Ivc2hhcmUvYWxzYS9zYW1wbGVzL0Zyb250X1JpZ2h0LndhdiIKZGlmZiAtLWdpdCBhL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuMSBiL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWYwODE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC4xCkBAIC0wLDAgKzEsMTY5IEBACisuXCIgLSotIG5yb2ZmIC0qLQorLlwiIG1hY3JvcworLmRlIEVYIFwiIEJlZ2luIEV4YW1wbGUKKy4gIElQCisuICBmdCBDVworLiAgbmYKKy4gIG5lIFxcJDEKKy4uCisuZGUgRUUgXCIgRW5kIEV4YW1wbGUKKy4gIGZ0IFAKKy4gIGZpCisuICBQUAorLi4KKy5USCBTUEVBS0VSXC1URVNUIDEgIkFwcmlsIDJuZCwgMjAxMSIgc3BlYWtlci10ZXN0CisuU0ggTkFNRQorc3BlYWtlclwtdGVzdCBcLSBjb21tYW5kLWxpbmUgc3BlYWtlciB0ZXN0IHRvbmUgZ2VuZXJhdG9yIGZvciBBTFNBIAorLlNIIFNZTk9QU0lTCisuQiBzcGVha2VyXC10ZXN0IFtcLW9wdGlvbnNdCisKKy5TSCBERVNDUklQVElPTgorXGZCc3BlYWtlclwtdGVzdFxmUCBnZW5lcmF0ZXMgYSB0b25lIHRoYXQgY2FuIGJlIHVzZWQgdG8gdGVzdCB0aGUgc3BlYWtlcnMgb2YgYSBjb21wdXRlci4KKworXGZCc3BlYWtlci10ZXN0XGZQIGJ5IGRlZmF1bHQgd2lsbCB0ZXN0IHRoZSBcZklkZWZhdWx0XGZQIGRldmljZS4gSWYgeW91Cit3YW50IHRvIHRlc3QgYW5vdGhlciBzb3VuZCBkZXZpY2UgeW91IHdpbGwgaGF2ZSBmaXJzdCB0byBnZXQgYSBsaXN0IG9mCithbGwgb2YgdGhlIHNvdW5kIGNhcmRzIGluIHlvdXIgc3lzdGVtIGFuZCB0aGUgZGV2aWNlcyBhc3NvY2lhdGVkIHdpdGgKK3Rob3NlIGNhcmRzLiBOb3RpY2UgdGhhdCB0aGVyZSBtaWdodCBiZSBmb3IgZXhhbXBsZSwgb25lIGRldmljZSBmb3IKK2FuYWxvZyBzb3VuZCwgb25lIGZvciBkaWdpdGFsIHNvdW5kIGFuZCBvbmUgZm9yIEhETUkgc291bmQuCitUbyBnZXQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGNhcmRzIGFuZCBkZXZpY2VzIHlvdSBjYW4gcnVuIFxmQmFwbGF5IC1MXGZSLgorCisuUCBcZkJhcGxheVxmUidzIG91dHB1dCB3aWxsIGJlIHNpbWlsYXIgdG8gdGhpcyBvbmU6CisKKy5uZgorJCBhcGxheSAtTAorbnVsbAorICAgIERpc2NhcmQgYWxsIHNhbXBsZXMgKHBsYXliYWNrKSBvciBnZW5lcmF0ZSB6ZXJvIHNhbXBsZXMgKGNhcHR1cmUpCitkZWZhdWx0OkNBUkQ9SUNINQorICAgIEludGVsIElDSDUsIEludGVsIElDSDUKKyAgICBEZWZhdWx0IEF1ZGlvIERldmljZQorZnJvbnQ6Q0FSRD1JQ0g1LERFVj0wCisgICAgSW50ZWwgSUNINSwgSW50ZWwgSUNINQorICAgIEZyb250IHNwZWFrZXJzCitzdXJyb3VuZDQwOkNBUkQ9SUNINSxERVY9MAorICAgIEludGVsIElDSDUsIEludGVsIElDSDUKKyAgICA0LjAgU3Vycm91bmQgb3V0cHV0IHRvIEZyb250IGFuZCBSZWFyIHNwZWFrZXJzCisoLi4uKQorLmZpCisKKy5QIEVhY2ggb2YgdGhlIGRldmljZXMgaXMgbGlzdGVkIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRlZmluaXRpb24gc28sCitpbiB0aGUgYWJvdmUgZXhhbXBsZSwgdGhlcmUgYXJlIGZvdXIgZGV2aWNlcyBsaXN0ZWQ6IG51bGwsIGRlZmF1bHQsIGZyb250CithbmQgc3Vycm91bmQ0MC4gU28sIGlmIHlvdSB3YW50IHRvIHRlc3QgdGhlIGxhc3QgZGV2aWNlIHlvdSBjYW4gCitydW4gXGZCc3BlYWtlci10ZXN0IC1Ec3Vycm91bmQ0MDpJQ0g1IC1jIDZcZlIuIFRoZSBcZkItY1xmUiBvcHRpb24gd2lsbAoraW5kaWNhdGUgdGhhdCB0aGUgc2l4IGF1ZGlvIGNoYW5uZWxzIGluIHRoZSBkZXZpY2UgaGF2ZSB0byBiZSB0ZXN0ZWQuCisKKworCisKKworLlNIIE9QVElPTlMKKworLlRQCitcZkJcLWNcZlAgfCBcZkJcLVwtY2hhbm5lbHNcZlAgXGZJTlVNXGZQCitcZklOVU1cZlAgY2hhbm5lbHMgaW4gc3RyZWFtCisKKy5UUAorXGZCXC1EXGZQIHwgXGZCXC1cLWRldmljZVxmUCBcZklOQU1FXGZQCitQQ00gZGV2aWNlIG5hbWUgXGZJTkFNRVxmUAorCisuVFAKK1xmQlwtZlxmUCB8IFxmQlwtXC1mcmVxdWVuY3lcZlAgXGZJRlJFUVxmUAorc2luZSB3YXZlIG9mIFxmSUZSRVFcZlAgSHoKKworLlRQCitcZkJcLVwtaGVscFxmUAorUHJpbnQgdXNhZ2UgaGVscAorCisuVFAKK1xmQlwtYlxmUCB8IFxmQlwtXC1idWZmZXJcZlAgXGZJVElNRVxmUAorVXNlIGJ1ZmZlciBzaXplIG9mIFxmSVRJTUVcZlAgbWljcm9zZWNvbmRzLgorV2hlbiAwIGlzIGdpdmVuLCB1c2UgdGhlIG1heGltYWwgYnVmZmVyIHNpemUuCitUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLgorCisuVFAKK1xmQlwtcFxmUCB8IFxmQlwtXC1wZXJpb2RcZlAgXGZJVElNRVxmUAorVXNlIHBlcmlvZCBzaXplIG9mIFxmSVRJTUVcZlAgbWljcm9zZWNvbmRzLgorV2hlbiAwIGlzIGdpdmVuLCB0aGUgcGVyaW9kcyBnaXZlbiBieSBcZkJcLVBcZlAgb3B0aW9uIGlzIHVzZWQuCitUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLgorCisuVFAKK1xmQlwtUFxmUCB8IFxmQlwtXC1ucGVyaW9kc1xmUCBcZlBFUklPRFNcZlAKK1VzZSBudW1iZXIgb2YgcGVyaW9kcy4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDQuCisKKy5UUAorXGZCXC1yXGZQIHwgXGZCXC1cLXJhdGVcZlAgXGZJUkFURVxmUAorc3RyZWFtIG9mIFxmSVJBVEVcZlAgSHoKKworLlRQCitcZkJcLXRcZlAgfCBcZkJcLVwtdGVzdFxmUCBcZkJwaW5rXGZQfFxmQnNpbmVcZlB8XGZCd2F2XGZQCitcZkJcLXQgcGlua1xmUCBtZWFucyB1c2UgcGluayBub2lzZSAoZGVmYXVsdCkuCisKK1Bpbmsgbm9pc2UgaXMgcGVyY2VwdHVhbGx5IHVuaWZvcm0gbm9pc2UgLS0gdGhhdCBpcywgaXQgc291bmRzIGxpa2UgZXZlcnkgZnJlcXVlbmN5IGF0IG9uY2UuICBJZiB5b3UgY2FuIGhlYXIgYW55IHRvbmUgaXQgbWF5IGluZGljYXRlIHJlc29uYW5jZXMgaW4geW91ciBzcGVha2VyIHN5c3RlbSBvciByb29tLgorCitcZkJcLXQgc2luZVxmUCBtZWFucyB0byB1c2Ugc2luZSB3YXZlLgorCitcZkJcLXQgd2F2XGZQIG1lYW5zIHRvIHBsYXkgV0FWIGZpbGVzLCBlaXRoZXIgcHJlLWRlZmluZWQgZmlsZXMgb3IgZ2l2ZW4gdmlhIFxmQlwtd1xmUCBvcHRpb24uCisKK1lvdSBjYW4gcGFzcyB0aGUgbnVtYmVyIGZyb20gMSB0byAzIGFzIGEgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKworLlRQCitcZkJcLWxcZlAgfCBcZkJcLVwtbmxvb3BzXGZQIFxmQkNPVU5UXGZQCisKK1NwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGxvb3BzLiAgWmVybyBtZWFucyB0byBydW4gaW5maW5pdGVseS4KKworV2hlbiBcZkJcLXNcZlAgb3B0aW9uIGJlbG93IHdpdGggYSB2YWxpZCBjaGFubmVsIGlzIGdpdmVuLCBcZkJzcGVha2VyXC10ZXN0XGZQIHdpbGwgcGVyZm9ybQorYWx3YXlzIGEgc2luZ2xlLXNob3Qgd2l0aG91dCBsb29waW5nLgorCisuVFAKK1xmQlwtc1xmUCB8IFxmQlwtXC1zcGVha2VyXGZQIFxmQkNIQU5ORUxcZlAKK0RvIGEgc2luZ2xlLXNob3Qgc3BlYWtlciB0ZXN0IGZvciB0aGUgZ2l2ZW4gY2hhbm5lbC4gIFRoZSBjaGFubmVsIG51bWJlciBzdGFydHMgZnJvbSAxLgorVGhlIGNoYW5uZWwgbnVtYmVyIGNvcnJlc3BvbmRzIHRvIGxlZnQsIHJpZ2h0LCByZWFyLWxlZnQsIHJlYXItcmlnaHQsIGNlbnRlciwgTEZFLAorc2lkZS1sZWZ0LCBzaWRlLXJpZ2h0LCBhbmQgc28gb24uCisKK0ZvciBleGFtcGxlLCB3aGVuIDEgaXMgcGFzc2VkLCBpdCB0ZXN0cyB0aGUgbGVmdCBjaGFubmVsIG9ubHkgb25jZSByYXRoZXIgdGhhbiBib3RoIGNoYW5uZWxzCit3aXRoIGxvb3BpbmcuCisKKy5UUAorXGZCXC13XGZQIHwgXGZCXC1cLXdhdmZpbGVcZlAKK1VzZSB0aGUgZ2l2ZW4gV0FWIGZpbGUgZm9yIHRoZSBwbGF5YmFjayBpbnN0ZWFkIG9mIHByZS1kZWZpbmVkIFdBViBmaWxlcy4KKworLlRQCitcZkJcLVdcZlAgfCBcZkJcLVwtd2F2ZGlyXGZQCitTcGVjaWZ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBXQVYgZmlsZXMgZm9yIHBsYXliYWNrLgorVGhlIGRlZmF1bHQgcGF0aCBpcyBcZkkvdXNyL3NoYXJlL3NvdW5kcy9hbHNhXGZQLgorCisKKy5TSCBVU0FHRSBFWEFNUExFUworCitQcm9kdWNlIHN0ZXJlbyBzb3VuZCBmcm9tIG9uZSBzdGVyZW8gamFjazoKKy5FWAorICBzcGVha2VyLXRlc3QgLURwbHVnOmZyb250IC1jMgorLkVFCisKK1Byb2R1Y2UgNCBzcGVha2VyIHNvdW5kIGZyb20gdHdvIHN0ZXJlbyBqYWNrczoKKy5FWAorICBzcGVha2VyLXRlc3QgLURwbHVnOnN1cnJvdW5kNDAgLWM0CisuRUUKKworUHJvZHVjZSA1LjEgc3BlYWtlciBzb3VuZCBmcm9tIHRocmVlIHN0ZXJlbyBqYWNrczoKKy5FWAorICBzcGVha2VyLXRlc3QgLURwbHVnOnN1cnJvdW5kNTEgLWM2CisuRUUKKworVG8gc2VuZCBhIG5pY2UgbG93IDc1SHogdG9uZSB0byB0aGUgV29vZmVyIGFuZCB0aGVuIGV4aXQgd2l0aG91dCB0b3VjaGluZyBhbnkgb3RoZXIgc3BlYWtlcnM6CisuRVgKKyAgc3BlYWtlci10ZXN0IC1EcGx1ZzpzdXJyb3VuZDUxIC1jNiAtczEgLWY3NQorLkVFCisKK1RvIGRvIGEgMi1zcGVha2VyIHRlc3QgdXNpbmcgdGhlIHNwZGlmIChjb2F4IG9yIG9wdGljYWwpIG91dHB1dDoKKy5FWAorICBzcGVha2VyLXRlc3QgLURwbHVnOnNwZGlmIC1jMgorLkVFCisKKworLlNIIFNFRSBBTFNPCisuQlIgYXBsYXkoMSkKKworLlNIIEFVVEhPUgorVGhlIHNwZWFrZXItdGVzdCBwcm9ncmFtIHdhcyB3cml0dGVuIGJ5IEphbWVzIENvdXJ0aWVyLUR1dHRvbi4KK1Bpbmsgbm9pc2Ugc3VwcG9ydCB3YXMgYWRkZWQgYnkgTmF0aGFuIEh1cnN0LgorRnVydGhlciBleHRlbnNpb25zIGJ5IFRha2FzaGkgSXdhaS4KZGlmZiAtLWdpdCBhL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYyBiL3NwZWFrZXItdGVzdC9zcGVha2VyLXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDI5MTEwCi0tLSAvZGV2L251bGwKKysrIGIvc3BlYWtlci10ZXN0L3NwZWFrZXItdGVzdC5jCkBAIC0wLDAgKzEsMTA4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IEphbWVzIENvdXJ0aWVyLUR1dHRvbgorICogQ29weXJpZ2h0IChDKSAyMDA1IE5hdGhhbiBIdXJzdAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBzcGVha2VyLXRlc3QgdG9vbC4KKyAqCisgKiBUaGlzIHNtYWxsIHByb2dyYW0gc2VuZHMgYSBzaW1wbGUgc2ludXNvaWRhbCB3YXZlIHRvIHlvdXIgc3BlYWtlcnMuCisgKgorICogc3BlYWtlci10ZXN0IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBzcGVha2VyLXRlc3QgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EKKyAqCisgKgorICogTWFpbiBwcm9ncmFtIGJ5IEphbWVzIENvdXJ0aWVyLUR1dHRvbiAoaW5jbHVkaW5nIHNvbWUgc291cmNlIGNvZGUgZnJhZ21lbnRzIGZyb20gdGhlIGFsc2EgcHJvamVjdC4pCisgKiBTb21lIGNsZWFudXAgZnJvbSBEYW5pZWwgQ2F1am9sbGUtQmVydCA8c2VnZmF1bHRAY2x1Yi1pbnRlcm5ldC5mcj4KKyAqIFBpbmsgbm9pc2Ugb3B0aW9uIGFkZGVkIE5hdGhhbiBIdXJzdCwgCisgKiAgIGJhc2VkIG9uIGdlbmVyYXRvciBieSBQaGlsIEJ1cmsgKHBpbmsuYykKKyAqCisgKiBDaGFuZ2Vsb2c6CisgKiAgIDAuMC44IEFkZGVkIHN1cHBvcnQgZm9yIHBpbmsgbm9pc2Ugb3V0cHV0LgorICogQ2hhbmdlbG9nOgorICogICAwLjAuNyBBZGRlZCBzdXBwb3J0IGZvciBtb3JlIHRoYW4gNiBjaGFubmVscy4KKyAqIENoYW5nZWxvZzoKKyAqICAgMC4wLjYgQWRkZWQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IHNhbXBsZSBmb3JtYXRzLgorICoKKyAqICRJZDogc3BlYWtlcl90ZXN0LmMsdiAxLjAwIDIwMDMvMTEvMjYgMTk6NDM6MzggamNkdXR0b24gRXhwICQKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisKKyNkZWZpbmUgQUxTQV9QQ01fTkVXX0hXX1BBUkFNU19BUEkKKyNkZWZpbmUgQUxTQV9QQ01fTkVXX1NXX1BBUkFNU19BUEkKKyNpbmNsdWRlIDxhbHNhL2Fzb3VuZGxpYi5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgInBpbmsuaCIKKyNpbmNsdWRlICJhY29uZmlnLmgiCisjaW5jbHVkZSAiZ2V0dGV4dC5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKworI2lmZGVmIEVOQUJMRV9OTFMKKyNpbmNsdWRlIDxsb2NhbGUuaD4KKyNlbmRpZgorCitlbnVtIHsKKyAgVEVTVF9QSU5LX05PSVNFID0gMSwKKyAgVEVTVF9TSU5FLAorICBURVNUX1dBViwKKyAgVEVTVF9QQVRURVJOLAorfTsKKworI2RlZmluZSBNQVhfQ0hBTk5FTFMJMTYKKworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgQ09NUE9TRV9JRChhLGIsYyxkKQkoKGEpIHwgKChiKTw8OCkgfCAoKGMpPDwxNikgfCAoKGQpPDwyNCkpCisjZGVmaW5lIExFX1NIT1JUKHYpCQkodikKKyNkZWZpbmUgTEVfSU5UKHYpCQkodikKKyNkZWZpbmUgQkVfU0hPUlQodikJCWJzd2FwXzE2KHYpCisjZGVmaW5lIEJFX0lOVCh2KQkJYnN3YXBfMzIodikKKyNlbHNlIC8qIF9fQklHX0VORElBTiAqLworI2RlZmluZSBDT01QT1NFX0lEKGEsYixjLGQpCSgoZCkgfCAoKGMpPDw4KSB8ICgoYik8PDE2KSB8ICgoYSk8PDI0KSkKKyNkZWZpbmUgTEVfU0hPUlQodikJCWJzd2FwXzE2KHYpCisjZGVmaW5lIExFX0lOVCh2KQkJYnN3YXBfMzIodikKKyNkZWZpbmUgQkVfU0hPUlQodikJCSh2KQorI2RlZmluZSBCRV9JTlQodikJCSh2KQorI2VuZGlmCisKK3N0YXRpYyBjaGFyICAgICAgICAgICAgICAqZGV2aWNlICAgICAgPSAiZGVmYXVsdCI7ICAgICAgIC8qIHBsYXliYWNrIGRldmljZSAqLworc3RhdGljIHNuZF9wY21fZm9ybWF0X3QgICBmb3JtYXQgICAgICA9IFNORF9QQ01fRk9STUFUX1MxNjsgLyogc2FtcGxlIGZvcm1hdCAqLworc3RhdGljIHVuc2lnbmVkIGludCAgICAgICByYXRlICAgICAgICA9IDQ4MDAwOwkgICAgICAgICAgICAvKiBzdHJlYW0gcmF0ZSAqLworc3RhdGljIHVuc2lnbmVkIGludCAgICAgICBjaGFubmVscyAgICA9IDE7CSAgICAgICAgICAgIC8qIGNvdW50IG9mIGNoYW5uZWxzICovCitzdGF0aWMgdW5zaWduZWQgaW50ICAgICAgIHNwZWFrZXIgICAgID0gMDsJICAgICAgICAgICAgLyogY291bnQgb2YgY2hhbm5lbHMgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgICAgICAgYnVmZmVyX3RpbWUgPSAwOwkgICAgICAgICAgICAvKiByaW5nIGJ1ZmZlciBsZW5ndGggaW4gdXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgICAgICAgcGVyaW9kX3RpbWUgPSAwOwkgICAgICAgICAgICAvKiBwZXJpb2QgdGltZSBpbiB1cyAqLworc3RhdGljIHVuc2lnbmVkIGludCAgICAgICBucGVyaW9kcyAgICA9IDQ7ICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHBlcmlvZHMgKi8KK3N0YXRpYyBkb3VibGUgICAgICAgICAgICAgZnJlcSAgICAgICAgPSA0NDAuMDsgICAgICAgICAgICAgIC8qIHNpbnVzb2lkYWwgd2F2ZSBmcmVxdWVuY3kgaW4gSHogKi8KK3N0YXRpYyBpbnQgICAgICAgICAgICAgICAgdGVzdF90eXBlICAgPSBURVNUX1BJTktfTk9JU0U7ICAgIC8qIFRlc3QgdHlwZS4gMSA9IG5vaXNlLCAyID0gc2luZSB3YXZlICovCitzdGF0aWMgcGlua19ub2lzZV90IHBpbms7CitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QgIGJ1ZmZlcl9zaXplOworc3RhdGljIHNuZF9wY21fdWZyYW1lc190ICBwZXJpb2Rfc2l6ZTsKK3N0YXRpYyBjb25zdCBjaGFyICpnaXZlbl90ZXN0X3dhdl9maWxlID0gTlVMTDsKK3N0YXRpYyBjaGFyICp3YXZfZmlsZV9kaXIgPSBTT1VORFNESVI7CitzdGF0aWMgaW50IGRlYnVnID0gMDsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNoYW5uZWxfbmFtZVtNQVhfQ0hBTk5FTFNdID0geworICAvKiAgMCAqLyBOXygiRnJvbnQgTGVmdCIpLAorICAvKiAgMSAqLyBOXygiRnJvbnQgUmlnaHQiKSwKKyAgLyogIDIgKi8gTl8oIlJlYXIgTGVmdCIpLAorICAvKiAgMyAqLyBOXygiUmVhciBSaWdodCIpLAorICAvKiAgNCAqLyBOXygiQ2VudGVyIiksCisgIC8qICA1ICovIE5fKCJMRkUiKSwKKyAgLyogIDYgKi8gTl8oIlNpZGUgTGVmdCIpLAorICAvKiAgNyAqLyBOXygiU2lkZSBSaWdodCIpLAorICAvKiAgOCAqLyBOXygiQ2hhbm5lbCA5IiksCisgIC8qICA5ICovIE5fKCJDaGFubmVsIDEwIiksCisgIC8qIDEwICovIE5fKCJDaGFubmVsIDExIiksCisgIC8qIDExICovIE5fKCJDaGFubmVsIDEyIiksCisgIC8qIDEyICovIE5fKCJDaGFubmVsIDEzIiksCisgIC8qIDEzICovIE5fKCJDaGFubmVsIDE0IiksCisgIC8qIDE0ICovIE5fKCJDaGFubmVsIDE1IiksCisgIC8qIDE1ICovIE5fKCJDaGFubmVsIDE2IikKK307CisKK3N0YXRpYyBjb25zdCBpbnQJY2hhbm5lbHM0W10gPSB7CisgIDAsIC8qIEZyb250IExlZnQgICovCisgIDEsIC8qIEZyb250IFJpZ2h0ICovCisgIDMsIC8qIFJlYXIgUmlnaHQgICovCisgIDIsIC8qIFJlYXIgTGVmdCAgICovCit9Oworc3RhdGljIGNvbnN0IGludAljaGFubmVsczZbXSA9IHsKKyAgMCwgLyogRnJvbnQgTGVmdCAgKi8KKyAgNCwgLyogQ2VudGVyICAgICAgKi8KKyAgMSwgLyogRnJvbnQgUmlnaHQgKi8KKyAgMywgLyogUmVhciBSaWdodCAgKi8KKyAgMiwgLyogUmVhciBMZWZ0ICAgKi8KKyAgNSwgLyogTEZFICAgICAgICAgKi8KK307CitzdGF0aWMgY29uc3QgaW50CWNoYW5uZWxzOFtdID0geworICAwLCAvKiBGcm9udCBMZWZ0ICAqLworICA0LCAvKiBDZW50ZXIgICAgICAqLworICAxLCAvKiBGcm9udCBSaWdodCAqLworICA3LCAvKiBTaWRlIFJpZ2h0ICAqLworICAzLCAvKiBSZWFyIFJpZ2h0ICAqLworICAyLCAvKiBSZWFyIExlZnQgICAqLworICA2LCAvKiBTaWRlIExlZnQgICAqLworICA1LCAvKiBMRkUgICAgICAgICAqLworfTsKK3N0YXRpYyBjb25zdCBpbnQJc3VwcG9ydGVkX2Zvcm1hdHNbXSA9IHsKKyAgU05EX1BDTV9GT1JNQVRfUzgsCisgIFNORF9QQ01fRk9STUFUX1MxNl9MRSwKKyAgU05EX1BDTV9GT1JNQVRfUzE2X0JFLAorICBTTkRfUENNX0ZPUk1BVF9GTE9BVF9MRSwKKyAgU05EX1BDTV9GT1JNQVRfUzMyX0xFLAorICBTTkRfUENNX0ZPUk1BVF9TMzJfQkUsCisgIC0xCit9OworCitzdGF0aWMgdm9pZCBnZW5lcmF0ZV9zaW5lKHVpbnQ4X3QgKmZyYW1lcywgaW50IGNoYW5uZWwsIGludCBjb3VudCwgZG91YmxlICpfcGhhc2UpIHsKKyAgZG91YmxlIHBoYXNlID0gKl9waGFzZTsKKyAgZG91YmxlIG1heF9waGFzZSA9IDEuMCAvIGZyZXE7CisgIGRvdWJsZSBzdGVwID0gMS4wIC8gKGRvdWJsZSlyYXRlOworICBkb3VibGUgcmVzOworICBmbG9hdCBmcmVzOworICBpbnQgICAgY2huOworICBpbnQzMl90ICBpcmVzOworICBpbnQ4X3QgKnNhbXA4ID0gKGludDhfdCopIGZyYW1lczsKKyAgaW50MTZfdCAqc2FtcDE2ID0gKGludDE2X3QqKSBmcmFtZXM7CisgIGludDMyX3QgKnNhbXAzMiA9IChpbnQzMl90KikgZnJhbWVzOworICBmbG9hdCAgICpzYW1wX2YgPSAoZmxvYXQqKSBmcmFtZXM7CisKKyAgd2hpbGUgKGNvdW50LS0gPiAwKSB7CisgICAgZm9yKGNobj0wO2NobjxjaGFubmVscztjaG4rKykgeworICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgIGNhc2UgU05EX1BDTV9GT1JNQVRfUzg6CisgICAgICAgIGlmIChjaG49PWNoYW5uZWwpIHsKKyAgICAgICAgICByZXMgPSAoc2luKChwaGFzZSAqIDIgKiBNX1BJKSAvIG1heF9waGFzZSAtIE1fUEkpKSAqIDB4MDNmZmZmZmZmOyAvKiBEb24ndCB1c2UgTUFYIHZvbHVtZSAqLworICAgICAgICAgIGlyZXMgPSByZXM7CisgICAgICAgICAgKnNhbXA4KysgPSBpcmVzID4+IDI0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICpzYW1wOCsrID0gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU05EX1BDTV9GT1JNQVRfUzE2X0xFOgorICAgICAgICBpZiAoY2huPT1jaGFubmVsKSB7CisgICAgICAgICAgcmVzID0gKHNpbigocGhhc2UgKiAyICogTV9QSSkgLyBtYXhfcGhhc2UgLSBNX1BJKSkgKiAweDAzZmZmZmZmZjsgLyogRG9uJ3QgdXNlIE1BWCB2b2x1bWUgKi8KKyAgICAgICAgICBpcmVzID0gcmVzOworICAgICAgICAgICpzYW1wMTYrKyA9IExFX1NIT1JUKGlyZXMgPj4gMTYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICpzYW1wMTYrKyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNORF9QQ01fRk9STUFUX1MxNl9CRToKKyAgICAgICAgaWYgKGNobj09Y2hhbm5lbCkgeworICAgICAgICAgIHJlcyA9IChzaW4oKHBoYXNlICogMiAqIE1fUEkpIC8gbWF4X3BoYXNlIC0gTV9QSSkpICogMHgwM2ZmZmZmZmY7IC8qIERvbid0IHVzZSBNQVggdm9sdW1lICovCisgICAgICAgICAgaXJlcyA9IHJlczsKKyAgICAgICAgICAqc2FtcDE2KysgPSBCRV9TSE9SVChpcmVzID4+IDE2KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAqc2FtcDE2KysgPSAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTTkRfUENNX0ZPUk1BVF9GTE9BVF9MRToKKyAgICAgICAgaWYgKGNobj09Y2hhbm5lbCkgeworICAgICAgICAgIHJlcyA9IChzaW4oKHBoYXNlICogMiAqIE1fUEkpIC8gbWF4X3BoYXNlIC0gTV9QSSkpICogMC43NSA7IC8qIERvbid0IHVzZSBNQVggdm9sdW1lICovCisgICAgICAgICAgZnJlcyA9IHJlczsKKwkgICpzYW1wX2YrKyA9IGZyZXM7CisgICAgICAgIH0gZWxzZSB7CisJICAqc2FtcF9mKysgPSAwLjA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNORF9QQ01fRk9STUFUX1MzMl9MRToKKyAgICAgICAgaWYgKGNobj09Y2hhbm5lbCkgeworICAgICAgICAgIHJlcyA9IChzaW4oKHBoYXNlICogMiAqIE1fUEkpIC8gbWF4X3BoYXNlIC0gTV9QSSkpICogMHgwM2ZmZmZmZmY7IC8qIERvbid0IHVzZSBNQVggdm9sdW1lICovCisgICAgICAgICAgaXJlcyA9IHJlczsKKyAgICAgICAgICAqc2FtcDMyKysgPSBMRV9JTlQoaXJlcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKnNhbXAzMisrID0gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU05EX1BDTV9GT1JNQVRfUzMyX0JFOgorICAgICAgICBpZiAoY2huPT1jaGFubmVsKSB7CisgICAgICAgICAgcmVzID0gKHNpbigocGhhc2UgKiAyICogTV9QSSkgLyBtYXhfcGhhc2UgLSBNX1BJKSkgKiAweDAzZmZmZmZmZjsgLyogRG9uJ3QgdXNlIE1BWCB2b2x1bWUgKi8KKyAgICAgICAgICBpcmVzID0gcmVzOworICAgICAgICAgICpzYW1wMzIrKyA9IEJFX0lOVChpcmVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAqc2FtcDMyKysgPSAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgOworICAgICAgfQorICAgIH0KKworICAgIHBoYXNlICs9IHN0ZXA7CisgICAgaWYgKHBoYXNlID49IG1heF9waGFzZSkKKyAgICAgIHBoYXNlIC09IG1heF9waGFzZTsKKyAgfQorCisgICpfcGhhc2UgPSBwaGFzZTsKK30KKworLyogUGluayBub2lzZSBpcyBhIGJldHRlciB0ZXN0IHRoYW4gc2luZSB3YXZlIGJlY2F1c2Ugd2UgY2FuIHRlbGwKKyAqIHdoZXJlIHBpbmsgbm9pc2UgaXMgY29taW5nIGZyb20gbW9yZSBlYXNpbHkgdGhhdCBhIHNpbmUgd2F2ZS4KKyAqLworCisKK3N0YXRpYyB2b2lkIGdlbmVyYXRlX3Bpbmtfbm9pc2UoIHVpbnQ4X3QgKmZyYW1lcywgaW50IGNoYW5uZWwsIGludCBjb3VudCkgeworICBkb3VibGUgICByZXM7CisgIGludCAgICAgIGNobjsKKyAgaW50MzJfdCAgaXJlczsKKyAgaW50OF90ICAqc2FtcDggPSAoaW50OF90KikgZnJhbWVzOworICBpbnQxNl90ICpzYW1wMTYgPSAoaW50MTZfdCopIGZyYW1lczsKKyAgaW50MzJfdCAqc2FtcDMyID0gKGludDMyX3QqKSBmcmFtZXM7CisKKyAgd2hpbGUgKGNvdW50LS0gPiAwKSB7CisgICAgZm9yKGNobj0wO2NobjxjaGFubmVscztjaG4rKykgeworICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgIGNhc2UgU05EX1BDTV9GT1JNQVRfUzg6CisgICAgICAgIGlmIChjaG49PWNoYW5uZWwpIHsKKwkgIHJlcyA9IGdlbmVyYXRlX3Bpbmtfbm9pc2Vfc2FtcGxlKCZwaW5rKSAqIDB4MDNmZmZmZmZmOyAvKiBEb24ndCB1c2UgTUFYIHZvbHVtZSAqLworCSAgaXJlcyA9IHJlczsKKwkgICpzYW1wOCsrID0gaXJlcyA+PiAyNDsKKyAgICAgICAgfSBlbHNlIHsKKwkgICpzYW1wOCsrID0gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU05EX1BDTV9GT1JNQVRfUzE2X0xFOgorICAgICAgICBpZiAoY2huPT1jaGFubmVsKSB7CisJICByZXMgPSBnZW5lcmF0ZV9waW5rX25vaXNlX3NhbXBsZSgmcGluaykgKiAweDAzZmZmZmZmZjsgLyogRG9uJ3QgdXNlIE1BWCB2b2x1bWUgKi8KKwkgIGlyZXMgPSByZXM7CisgICAgICAgICAgKnNhbXAxNisrID0gTEVfU0hPUlQoaXJlcyA+PiAxNik7CisgICAgICAgIH0gZWxzZSB7CisJICAqc2FtcDE2KysgPSAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTTkRfUENNX0ZPUk1BVF9TMTZfQkU6CisgICAgICAgIGlmIChjaG49PWNoYW5uZWwpIHsKKyAgICAgICAgICByZXMgPSBnZW5lcmF0ZV9waW5rX25vaXNlX3NhbXBsZSgmcGluaykgKiAweDAzZmZmZmZmZjsgLyogRG9uJ3QgdXNlIE1BWCB2b2x1bWUgKi8KKyAgICAgICAgICBpcmVzID0gcmVzOworICAgICAgICAgICpzYW1wMTYrKyA9IEJFX1NIT1JUKGlyZXMgPj4gMTYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICpzYW1wMTYrKyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNORF9QQ01fRk9STUFUX1MzMl9MRToKKyAgICAgICAgaWYgKGNobj09Y2hhbm5lbCkgeworICAgICAgICAgIHJlcyA9IGdlbmVyYXRlX3Bpbmtfbm9pc2Vfc2FtcGxlKCZwaW5rKSAqIDB4MDNmZmZmZmZmOyAvKiBEb24ndCB1c2UgTUFYIHZvbHVtZSAqLworICAgICAgICAgIGlyZXMgPSByZXM7CisgICAgICAgICAgKnNhbXAzMisrID0gTEVfSU5UKGlyZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICpzYW1wMzIrKyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNORF9QQ01fRk9STUFUX1MzMl9CRToKKyAgICAgICAgaWYgKGNobj09Y2hhbm5lbCkgeworCSAgcmVzID0gZ2VuZXJhdGVfcGlua19ub2lzZV9zYW1wbGUoJnBpbmspICogMHgwM2ZmZmZmZmY7IC8qIERvbid0IHVzZSBNQVggdm9sdW1lICovCisJICBpcmVzID0gcmVzOworCSAgKnNhbXAzMisrID0gQkVfSU5UKGlyZXMpOworICAgICAgICB9IGVsc2UgeworCSAgKnNhbXAzMisrID0gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLyoKKyAqIHVzZWZ1bCBmb3IgdGVzdHMKKyAqLworc3RhdGljIHZvaWQgZ2VuZXJhdGVfcGF0dGVybih1aW50OF90ICpmcmFtZXMsIGludCBjaGFubmVsLCBpbnQgY291bnQsIGludCAqX3BhdHRlcm4pIHsKKyAgaW50IHBhdHRlcm4gPSAqX3BhdHRlcm47CisgIGludCAgICBjaG47CisgIGludDhfdCAqc2FtcDggPSAoaW50OF90KikgZnJhbWVzOworICBpbnQxNl90ICpzYW1wMTYgPSAoaW50MTZfdCopIGZyYW1lczsKKyAgaW50MzJfdCAqc2FtcDMyID0gKGludDMyX3QqKSBmcmFtZXM7CisgIGZsb2F0ICAgKnNhbXBfZiA9IChmbG9hdCopIGZyYW1lczsKKworICB3aGlsZSAoY291bnQtLSA+IDApIHsKKyAgICBmb3IoY2huPTA7Y2huPGNoYW5uZWxzO2NobisrLHBhdHRlcm4rKykgeworICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgIGNhc2UgU05EX1BDTV9GT1JNQVRfUzg6CisgICAgICAgIGlmIChjaG49PWNoYW5uZWwpIHsKKyAgICAgICAgICAqc2FtcDgrKyA9IHBhdHRlcm4gJiAweGZmOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICpzYW1wOCsrID0gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU05EX1BDTV9GT1JNQVRfUzE2X0xFOgorICAgICAgICBpZiAoY2huPT1jaGFubmVsKSB7CisgICAgICAgICAgKnNhbXAxNisrID0gTEVfU0hPUlQocGF0dGVybiAmIDB4ZmZmZmYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICpzYW1wMTYrKyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNORF9QQ01fRk9STUFUX1MxNl9CRToKKyAgICAgICAgaWYgKGNobj09Y2hhbm5lbCkgeworICAgICAgICAgICpzYW1wMTYrKyA9IEJFX1NIT1JUKHBhdHRlcm4gJiAweGZmZmYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICpzYW1wMTYrKyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNORF9QQ01fRk9STUFUX0ZMT0FUX0xFOgorICAgICAgICBpZiAoY2huPT1jaGFubmVsKSB7CisJICAqc2FtcF9mKysgPSBMRV9JTlQoKChkb3VibGUpcGF0dGVybikgLyBJTlQzMl9NQVgpOworICAgICAgICB9IGVsc2UgeworCSAgKnNhbXBfZisrID0gMC4wOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTTkRfUENNX0ZPUk1BVF9TMzJfTEU6CisgICAgICAgIGlmIChjaG49PWNoYW5uZWwpIHsKKyAgICAgICAgICAqc2FtcDMyKysgPSBMRV9JTlQocGF0dGVybik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKnNhbXAzMisrID0gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU05EX1BDTV9GT1JNQVRfUzMyX0JFOgorICAgICAgICBpZiAoY2huPT1jaGFubmVsKSB7CisgICAgICAgICAgKnNhbXAzMisrID0gQkVfSU5UKHBhdHRlcm4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICpzYW1wMzIrKyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICA7CisgICAgICB9CisgICAgfQorICB9CisKKyAgKl9wYXR0ZXJuID0gcGF0dGVybjsKK30KKworc3RhdGljIGludCBzZXRfaHdwYXJhbXMoc25kX3BjbV90ICpoYW5kbGUsIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9hY2Nlc3NfdCBhY2Nlc3MpIHsKKyAgdW5zaWduZWQgaW50IHJyYXRlOworICBpbnQgICAgICAgICAgZXJyOworICBzbmRfcGNtX3VmcmFtZXNfdCAgICAgcGVyaW9kX3NpemVfbWluOworICBzbmRfcGNtX3VmcmFtZXNfdCAgICAgcGVyaW9kX3NpemVfbWF4OworICBzbmRfcGNtX3VmcmFtZXNfdCAgICAgYnVmZmVyX3NpemVfbWluOworICBzbmRfcGNtX3VmcmFtZXNfdCAgICAgYnVmZmVyX3NpemVfbWF4OworCisgIC8qIGNob29zZSBhbGwgcGFyYW1ldGVycyAqLworICBlcnIgPSBzbmRfcGNtX2h3X3BhcmFtc19hbnkoaGFuZGxlLCBwYXJhbXMpOworICBpZiAoZXJyIDwgMCkgeworICAgIGZwcmludGYoc3RkZXJyLCBfKCJCcm9rZW4gY29uZmlndXJhdGlvbiBmb3IgcGxheWJhY2s6IG5vIGNvbmZpZ3VyYXRpb25zIGF2YWlsYWJsZTogJXNcbiIpLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisgICAgcmV0dXJuIGVycjsKKyAgfQorCisgIC8qIHNldCB0aGUgaW50ZXJsZWF2ZWQgcmVhZC93cml0ZSBmb3JtYXQgKi8KKyAgZXJyID0gc25kX3BjbV9od19wYXJhbXNfc2V0X2FjY2VzcyhoYW5kbGUsIHBhcmFtcywgYWNjZXNzKTsKKyAgaWYgKGVyciA8IDApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgXygiQWNjZXNzIHR5cGUgbm90IGF2YWlsYWJsZSBmb3IgcGxheWJhY2s6ICVzXG4iKSwgc25kX3N0cmVycm9yKGVycikpOworICAgIHJldHVybiBlcnI7CisgIH0KKworICAvKiBzZXQgdGhlIHNhbXBsZSBmb3JtYXQgKi8KKyAgZXJyID0gc25kX3BjbV9od19wYXJhbXNfc2V0X2Zvcm1hdChoYW5kbGUsIHBhcmFtcywgZm9ybWF0KTsKKyAgaWYgKGVyciA8IDApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgXygiU2FtcGxlIGZvcm1hdCBub3QgYXZhaWxhYmxlIGZvciBwbGF5YmFjazogJXNcbiIpLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisgICAgcmV0dXJuIGVycjsKKyAgfQorCisgIC8qIHNldCB0aGUgY291bnQgb2YgY2hhbm5lbHMgKi8KKyAgZXJyID0gc25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzKGhhbmRsZSwgcGFyYW1zLCBjaGFubmVscyk7CisgIGlmIChlcnIgPCAwKSB7CisgICAgZnByaW50ZihzdGRlcnIsIF8oIkNoYW5uZWxzIGNvdW50ICglaSkgbm90IGF2YWlsYWJsZSBmb3IgcGxheWJhY2tzOiAlc1xuIiksIGNoYW5uZWxzLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisgICAgcmV0dXJuIGVycjsKKyAgfQorCisgIC8qIHNldCB0aGUgc3RyZWFtIHJhdGUgKi8KKyAgcnJhdGUgPSByYXRlOworICBlcnIgPSBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZShoYW5kbGUsIHBhcmFtcywgcmF0ZSwgMCk7CisgIGlmIChlcnIgPCAwKSB7CisgICAgZnByaW50ZihzdGRlcnIsIF8oIlJhdGUgJWlIeiBub3QgYXZhaWxhYmxlIGZvciBwbGF5YmFjazogJXNcbiIpLCByYXRlLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisgICAgcmV0dXJuIGVycjsKKyAgfQorCisgIGlmIChycmF0ZSAhPSByYXRlKSB7CisgICAgZnByaW50ZihzdGRlcnIsIF8oIlJhdGUgZG9lc24ndCBtYXRjaCAocmVxdWVzdGVkICVpSHosIGdldCAlaUh6LCBlcnIgJWQpXG4iKSwgcmF0ZSwgcnJhdGUsIGVycik7CisgICAgcmV0dXJuIC1FSU5WQUw7CisgIH0KKworICBwcmludGYoXygiUmF0ZSBzZXQgdG8gJWlIeiAocmVxdWVzdGVkICVpSHopXG4iKSwgcnJhdGUsIHJhdGUpOworICAvKiBzZXQgdGhlIGJ1ZmZlciB0aW1lICovCisgIGVyciA9IHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfc2l6ZV9taW4ocGFyYW1zLCAmYnVmZmVyX3NpemVfbWluKTsKKyAgZXJyID0gc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplX21heChwYXJhbXMsICZidWZmZXJfc2l6ZV9tYXgpOworICBlcnIgPSBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3NpemVfbWluKHBhcmFtcywgJnBlcmlvZF9zaXplX21pbiwgTlVMTCk7CisgIGVyciA9IHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2Rfc2l6ZV9tYXgocGFyYW1zLCAmcGVyaW9kX3NpemVfbWF4LCBOVUxMKTsKKyAgcHJpbnRmKF8oIkJ1ZmZlciBzaXplIHJhbmdlIGZyb20gJWx1IHRvICVsdVxuIiksYnVmZmVyX3NpemVfbWluLCBidWZmZXJfc2l6ZV9tYXgpOworICBwcmludGYoXygiUGVyaW9kIHNpemUgcmFuZ2UgZnJvbSAlbHUgdG8gJWx1XG4iKSxwZXJpb2Rfc2l6ZV9taW4sIHBlcmlvZF9zaXplX21heCk7CisgIGlmIChwZXJpb2RfdGltZSA+IDApIHsKKyAgICBwcmludGYoXygiUmVxdWVzdGVkIHBlcmlvZCB0aW1lICV1IHVzXG4iKSwgcGVyaW9kX3RpbWUpOworICAgIGVyciA9IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9uZWFyKGhhbmRsZSwgcGFyYW1zLCAmcGVyaW9kX3RpbWUsIE5VTEwpOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgXygiVW5hYmxlIHRvIHNldCBwZXJpb2QgdGltZSAldSB1cyBmb3IgcGxheWJhY2s6ICVzXG4iKSwKKwkgICAgIHBlcmlvZF90aW1lLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgfQorICBpZiAoYnVmZmVyX3RpbWUgPiAwKSB7CisgICAgcHJpbnRmKF8oIlJlcXVlc3RlZCBidWZmZXIgdGltZSAldSB1c1xuIiksIGJ1ZmZlcl90aW1lKTsKKyAgICBlcnIgPSBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3RpbWVfbmVhcihoYW5kbGUsIHBhcmFtcywgJmJ1ZmZlcl90aW1lLCBOVUxMKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgZnByaW50ZihzdGRlcnIsIF8oIlVuYWJsZSB0byBzZXQgYnVmZmVyIHRpbWUgJXUgdXMgZm9yIHBsYXliYWNrOiAlc1xuIiksCisJICAgICBidWZmZXJfdGltZSwgc25kX3N0cmVycm9yKGVycikpOworICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgIH0KKyAgaWYgKCEgYnVmZmVyX3RpbWUgJiYgISBwZXJpb2RfdGltZSkgeworICAgIGJ1ZmZlcl9zaXplID0gYnVmZmVyX3NpemVfbWF4OworICAgIGlmICghIHBlcmlvZF90aW1lKQorICAgICAgYnVmZmVyX3NpemUgPSAoYnVmZmVyX3NpemUgLyBucGVyaW9kcykgKiBucGVyaW9kczsKKyAgICBwcmludGYoXygiVXNpbmcgbWF4IGJ1ZmZlciBzaXplICVsdVxuIiksIGJ1ZmZlcl9zaXplKTsKKyAgICBlcnIgPSBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3NpemVfbmVhcihoYW5kbGUsIHBhcmFtcywgJmJ1ZmZlcl9zaXplKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgZnByaW50ZihzdGRlcnIsIF8oIlVuYWJsZSB0byBzZXQgYnVmZmVyIHNpemUgJWx1IGZvciBwbGF5YmFjazogJXNcbiIpLAorCSAgICAgYnVmZmVyX3NpemUsIHNuZF9zdHJlcnJvcihlcnIpKTsKKyAgICAgIHJldHVybiBlcnI7CisgICAgfQorICB9CisgIGlmICghIGJ1ZmZlcl90aW1lIHx8ICEgcGVyaW9kX3RpbWUpIHsKKyAgICBwcmludGYoXygiUGVyaW9kcyA9ICV1XG4iKSwgbnBlcmlvZHMpOworICAgIGVyciA9IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX25lYXIoaGFuZGxlLCBwYXJhbXMsICZucGVyaW9kcywgTlVMTCk7CisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCBfKCJVbmFibGUgdG8gc2V0IG5wZXJpb2RzICV1IGZvciBwbGF5YmFjazogJXNcbiIpLAorCSAgICAgbnBlcmlvZHMsIHNuZF9zdHJlcnJvcihlcnIpKTsKKyAgICAgIHJldHVybiBlcnI7CisgICAgfQorICB9CisKKyAgLyogd3JpdGUgdGhlIHBhcmFtZXRlcnMgdG8gZGV2aWNlICovCisgIGVyciA9IHNuZF9wY21faHdfcGFyYW1zKGhhbmRsZSwgcGFyYW1zKTsKKyAgaWYgKGVyciA8IDApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgXygiVW5hYmxlIHRvIHNldCBodyBwYXJhbXMgZm9yIHBsYXliYWNrOiAlc1xuIiksIHNuZF9zdHJlcnJvcihlcnIpKTsKKyAgICByZXR1cm4gZXJyOworICB9CisKKyAgc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplKHBhcmFtcywgJmJ1ZmZlcl9zaXplKTsKKyAgc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZF9zaXplKHBhcmFtcywgJnBlcmlvZF9zaXplLCBOVUxMKTsKKyAgcHJpbnRmKF8oIndhcyBzZXQgcGVyaW9kX3NpemUgPSAlbHVcbiIpLHBlcmlvZF9zaXplKTsKKyAgcHJpbnRmKF8oIndhcyBzZXQgYnVmZmVyX3NpemUgPSAlbHVcbiIpLGJ1ZmZlcl9zaXplKTsKKyAgaWYgKDIqcGVyaW9kX3NpemUgPiBidWZmZXJfc2l6ZSkgeworICAgIGZwcmludGYoc3RkZXJyLCBfKCJidWZmZXIgdG8gc21hbGwsIGNvdWxkIG5vdCB1c2VcbiIpKTsKKyAgICByZXR1cm4gLUVJTlZBTDsKKyAgfQorCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldF9zd3BhcmFtcyhzbmRfcGNtX3QgKmhhbmRsZSwgc25kX3BjbV9zd19wYXJhbXNfdCAqc3dwYXJhbXMpIHsKKyAgaW50IGVycjsKKworICAvKiBnZXQgdGhlIGN1cnJlbnQgc3dwYXJhbXMgKi8KKyAgZXJyID0gc25kX3BjbV9zd19wYXJhbXNfY3VycmVudChoYW5kbGUsIHN3cGFyYW1zKTsKKyAgaWYgKGVyciA8IDApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgXygiVW5hYmxlIHRvIGRldGVybWluZSBjdXJyZW50IHN3cGFyYW1zIGZvciBwbGF5YmFjazogJXNcbiIpLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisgICAgcmV0dXJuIGVycjsKKyAgfQorCisgIC8qIHN0YXJ0IHRoZSB0cmFuc2ZlciB3aGVuIGEgYnVmZmVyIGlzIGZ1bGwgKi8KKyAgZXJyID0gc25kX3BjbV9zd19wYXJhbXNfc2V0X3N0YXJ0X3RocmVzaG9sZChoYW5kbGUsIHN3cGFyYW1zLCBidWZmZXJfc2l6ZSk7CisgIGlmIChlcnIgPCAwKSB7CisgICAgZnByaW50ZihzdGRlcnIsIF8oIlVuYWJsZSB0byBzZXQgc3RhcnQgdGhyZXNob2xkIG1vZGUgZm9yIHBsYXliYWNrOiAlc1xuIiksIHNuZF9zdHJlcnJvcihlcnIpKTsKKyAgICByZXR1cm4gZXJyOworICB9CisKKyAgLyogYWxsb3cgdGhlIHRyYW5zZmVyIHdoZW4gYXQgbGVhc3QgcGVyaW9kX3NpemUgZnJhbWVzIGNhbiBiZSBwcm9jZXNzZWQgKi8KKyAgZXJyID0gc25kX3BjbV9zd19wYXJhbXNfc2V0X2F2YWlsX21pbihoYW5kbGUsIHN3cGFyYW1zLCBwZXJpb2Rfc2l6ZSk7CisgIGlmIChlcnIgPCAwKSB7CisgICAgZnByaW50ZihzdGRlcnIsIF8oIlVuYWJsZSB0byBzZXQgYXZhaWwgbWluIGZvciBwbGF5YmFjazogJXNcbiIpLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisgICAgcmV0dXJuIGVycjsKKyAgfQorCisgIC8qIHdyaXRlIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZSBwbGF5YmFjayBkZXZpY2UgKi8KKyAgZXJyID0gc25kX3BjbV9zd19wYXJhbXMoaGFuZGxlLCBzd3BhcmFtcyk7CisgIGlmIChlcnIgPCAwKSB7CisgICAgZnByaW50ZihzdGRlcnIsIF8oIlVuYWJsZSB0byBzZXQgc3cgcGFyYW1zIGZvciBwbGF5YmFjazogJXNcbiIpLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisgICAgcmV0dXJuIGVycjsKKyAgfQorCisgIHJldHVybiAwOworfQorCisvKgorICogICBVbmRlcnJ1biBhbmQgc3VzcGVuZCByZWNvdmVyeQorICovCisKK3N0YXRpYyBpbnQgeHJ1bl9yZWNvdmVyeShzbmRfcGNtX3QgKmhhbmRsZSwgaW50IGVycikgeworICBpZiAoZXJyID09IC1FUElQRSkgewkvKiB1bmRlci1ydW4gKi8KKyAgICBlcnIgPSBzbmRfcGNtX3ByZXBhcmUoaGFuZGxlKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgIGZwcmludGYoc3RkZXJyLCBfKCJDYW4ndCByZWNvdmVyeSBmcm9tIHVuZGVycnVuLCBwcmVwYXJlIGZhaWxlZDogJXNcbiIpLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisgICAgcmV0dXJuIDA7CisgIH0gCisgIGVsc2UgaWYgKGVyciA9PSAtRVNUUlBJUEUpIHsKKworICAgIHdoaWxlICgoZXJyID0gc25kX3BjbV9yZXN1bWUoaGFuZGxlKSkgPT0gLUVBR0FJTikKKyAgICAgIHNsZWVwKDEpOwkvKiB3YWl0IHVudGlsIHRoZSBzdXNwZW5kIGZsYWcgaXMgcmVsZWFzZWQgKi8KKworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICBlcnIgPSBzbmRfcGNtX3ByZXBhcmUoaGFuZGxlKTsKKyAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgXygiQ2FuJ3QgcmVjb3ZlcnkgZnJvbSBzdXNwZW5kLCBwcmVwYXJlIGZhaWxlZDogJXNcbiIpLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCisvKgorICogSGFuZGxlIFdBViBmaWxlcworICovCisKK3N0YXRpYyBjb25zdCBjaGFyICp3YXZfZmlsZVtNQVhfQ0hBTk5FTFNdOworc3RhdGljIGludCB3YXZfZmlsZV9zaXplW01BWF9DSEFOTkVMU107CisKK3N0cnVjdCB3YXZlX2hlYWRlciB7CisgIHN0cnVjdCB7CisgICAgdWludDMyX3QgbWFnaWM7CisgICAgdWludDMyX3QgbGVuZ3RoOworICAgIHVpbnQzMl90IHR5cGU7CisgIH0gaGRyOworICBzdHJ1Y3QgeworICAgIHVpbnQzMl90IHR5cGU7CisgICAgdWludDMyX3QgbGVuZ3RoOworICB9IGNodW5rMTsKKyAgc3RydWN0IHsKKyAgICB1aW50MTZfdCBmb3JtYXQ7CisgICAgdWludDE2X3QgY2hhbm5lbHM7CisgICAgdWludDMyX3QgcmF0ZTsKKyAgICB1aW50MzJfdCBieXRlc19wZXJfc2VjOworICAgIHVpbnQxNl90IHNhbXBsZV9zaXplOworICAgIHVpbnQxNl90IHNhbXBsZV9iaXRzOworICB9IGJvZHk7CisgIHN0cnVjdCB7CisgICAgdWludDMyX3QgdHlwZTsKKyAgICB1aW50MzJfdCBsZW5ndGg7CisgIH0gY2h1bms7Cit9OworCisjZGVmaW5lIFdBVl9SSUZGCQlDT01QT1NFX0lEKCdSJywnSScsJ0YnLCdGJykKKyNkZWZpbmUgV0FWX1dBVkUJCUNPTVBPU0VfSUQoJ1cnLCdBJywnVicsJ0UnKQorI2RlZmluZSBXQVZfRk1UCQkJQ09NUE9TRV9JRCgnZicsJ20nLCd0JywnICcpCisjZGVmaW5lIFdBVl9EQVRBCQlDT01QT1NFX0lEKCdkJywnYScsJ3QnLCdhJykKKyNkZWZpbmUgV0FWX1BDTV9DT0RFCQkxCisKK3N0YXRpYyBjb25zdCBjaGFyICpzZWFyY2hfZm9yX2ZpbGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgY2hhciAqZmlsZTsKKyAgaWYgKCpuYW1lID09ICcvJykKKyAgICByZXR1cm4gc3RyZHVwKG5hbWUpOworICBmaWxlID0gbWFsbG9jKHN0cmxlbih3YXZfZmlsZV9kaXIpICsgc3RybGVuKG5hbWUpICsgMik7CisgIGlmIChmaWxlKQorICAgIHNwcmludGYoZmlsZSwgIiVzLyVzIiwgd2F2X2ZpbGVfZGlyLCBuYW1lKTsKKyAgcmV0dXJuIGZpbGU7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfd2F2X2ZpbGUoaW50IGNoYW5uZWwsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIHN0cnVjdCB3YXZlX2hlYWRlciBoZWFkZXI7CisgIGludCBmZDsKKworICB3YXZfZmlsZVtjaGFubmVsXSA9IHNlYXJjaF9mb3JfZmlsZShuYW1lKTsKKyAgaWYgKCEgd2F2X2ZpbGVbY2hhbm5lbF0pIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgXygiTm8gZW5vdWdoIG1lbW9yeVxuIikpOworICAgIHJldHVybiAtRU5PTUVNOworICB9CisKKyAgaWYgKChmZCA9IG9wZW4od2F2X2ZpbGVbY2hhbm5lbF0sIE9fUkRPTkxZKSkgPCAwKSB7CisgICAgZnByaW50ZihzdGRlcnIsIF8oIkNhbm5vdCBvcGVuIFdBViBmaWxlICVzXG4iKSwgd2F2X2ZpbGVbY2hhbm5lbF0pOworICAgIHJldHVybiAtRUlOVkFMOworICB9CisgIGlmIChyZWFkKGZkLCAmaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgPCAoaW50KXNpemVvZihoZWFkZXIpKSB7CisgICAgZnByaW50ZihzdGRlcnIsIF8oIkludmFsaWQgV0FWIGZpbGUgJXNcbiIpLCB3YXZfZmlsZVtjaGFubmVsXSk7CisgICAgZ290byBlcnJvcjsKKyAgfQorICAKKyAgaWYgKGhlYWRlci5oZHIubWFnaWMgIT0gV0FWX1JJRkYgfHwgaGVhZGVyLmhkci50eXBlICE9IFdBVl9XQVZFKSB7CisgICAgZnByaW50ZihzdGRlcnIsIF8oIk5vdCBhIFdBViBmaWxlOiAlc1xuIiksIHdhdl9maWxlW2NoYW5uZWxdKTsKKyAgICBnb3RvIGVycm9yOworICB9CisgIGlmIChoZWFkZXIuYm9keS5mb3JtYXQgIT0gTEVfU0hPUlQoV0FWX1BDTV9DT0RFKSkgeworICAgIGZwcmludGYoc3RkZXJyLCBfKCJVbnN1cHBvcnRlZCBXQVYgZm9ybWF0ICVkIGZvciAlc1xuIiksCisJICAgIExFX1NIT1JUKGhlYWRlci5ib2R5LmZvcm1hdCksIHdhdl9maWxlW2NoYW5uZWxdKTsKKyAgICBnb3RvIGVycm9yOworICB9CisgIGlmIChoZWFkZXIuYm9keS5jaGFubmVscyAhPSBMRV9TSE9SVCgxKSkgeworICAgIGZwcmludGYoc3RkZXJyLCBfKCIlcyBpcyBub3QgYSBtb25vIHN0cmVhbSAoJWQgY2hhbm5lbHMpXG4iKSwKKwkgICAgd2F2X2ZpbGVbY2hhbm5lbF0sIExFX1NIT1JUKGhlYWRlci5ib2R5LmNoYW5uZWxzKSk7IAorICAgIGdvdG8gZXJyb3I7CisgIH0KKyAgaWYgKGhlYWRlci5ib2R5LnJhdGUgIT0gTEVfSU5UKHJhdGUpKSB7CisgICAgZnByaW50ZihzdGRlcnIsIF8oIlNhbXBsZSByYXRlIGRvZXNuJ3QgbWF0Y2ggKCVkKSBmb3IgJXNcbiIpLAorCSAgICBMRV9JTlQoaGVhZGVyLmJvZHkucmF0ZSksIHdhdl9maWxlW2NoYW5uZWxdKTsKKyAgICBnb3RvIGVycm9yOworICB9CisgIGlmIChoZWFkZXIuYm9keS5zYW1wbGVfYml0cyAhPSBMRV9TSE9SVCgxNikpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgXygiVW5zdXBwb3J0ZWQgc2FtcGxlIGZvcm1hdCBiaXRzICVkIGZvciAlc1xuIiksCisJICAgIExFX1NIT1JUKGhlYWRlci5ib2R5LnNhbXBsZV9iaXRzKSwgd2F2X2ZpbGVbY2hhbm5lbF0pOworICAgIGdvdG8gZXJyb3I7CisgIH0KKyAgaWYgKGhlYWRlci5jaHVuay50eXBlICE9IFdBVl9EQVRBKSB7CisgICAgZnByaW50ZihzdGRlcnIsIF8oIkludmFsaWQgV0FWIGZpbGUgJXNcbiIpLCB3YXZfZmlsZVtjaGFubmVsXSk7CisgICAgZ290byBlcnJvcjsKKyAgfQorICB3YXZfZmlsZV9zaXplW2NoYW5uZWxdID0gTEVfSU5UKGhlYWRlci5jaHVuay5sZW5ndGgpOworICBjbG9zZShmZCk7CisgIHJldHVybiAwOworCisgZXJyb3I6CisgIGNsb3NlKGZkKTsKKyAgcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgc2V0dXBfd2F2X2ZpbGUoaW50IGNobikKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHdhdnNbTUFYX0NIQU5ORUxTXSA9IHsKKyAgICAiRnJvbnRfTGVmdC53YXYiLAorICAgICJGcm9udF9SaWdodC53YXYiLAorICAgICJSZWFyX0xlZnQud2F2IiwKKyAgICAiUmVhcl9SaWdodC53YXYiLAorICAgICJGcm9udF9DZW50ZXIud2F2IiwKKyAgICAiUmVhcl9DZW50ZXIud2F2IiwgLyogRklYTUU6IHNob3VsZCBiZSAiQmFzcyIgb3Igc28gKi8KKyAgICAiU2lkZV9MZWZ0LndhdiIsCisgICAgIlNpZGVfUmlnaHQud2F2IiwKKyAgICAiQ2hhbm5lbF85LndhdiIsCisgICAgIkNoYW5uZWxfMTAud2F2IiwKKyAgICAiQ2hhbm5lbF8xMS53YXYiLAorICAgICJDaGFubmVsXzEyLndhdiIsCisgICAgIkNoYW5uZWxfMTMud2F2IiwKKyAgICAiQ2hhbm5lbF8xNC53YXYiLAorICAgICJDaGFubmVsXzE1LndhdiIsCisgICAgIkNoYW5uZWxfMTYud2F2IgorICB9OworCisgIGlmIChnaXZlbl90ZXN0X3dhdl9maWxlKQorICAgIHJldHVybiBjaGVja193YXZfZmlsZShjaG4sIGdpdmVuX3Rlc3Rfd2F2X2ZpbGUpOworICBlbHNlCisgICAgcmV0dXJuIGNoZWNrX3dhdl9maWxlKGNobiwgd2F2c1tjaG5dKTsKK30KKworc3RhdGljIGludCByZWFkX3dhdih1aW50MTZfdCAqYnVmLCBpbnQgY2hhbm5lbCwgaW50IG9mZnNldCwgaW50IGJ1ZnNpemUpCit7CisgIHN0YXRpYyBGSUxFICp3YXZmcCA9IE5VTEw7CisgIGludCBzaXplOworCisgIGlmICghIHdhdl9maWxlW2NoYW5uZWxdKSB7CisgICAgZnByaW50ZihzdGRlcnIsIF8oIlVuZGVmaW5lZCBjaGFubmVsICVkXG4iKSwgY2hhbm5lbCk7CisgICAgcmV0dXJuIC1FSU5WQUw7CisgIH0KKworICBpZiAob2Zmc2V0ID49IHdhdl9maWxlX3NpemVbY2hhbm5lbF0pCisgICByZXR1cm4gMDsgLyogZmluaXNoZWQgKi8KKworICBpZiAoISBvZmZzZXQpIHsKKyAgICBpZiAod2F2ZnApCisgICAgICBmY2xvc2Uod2F2ZnApOworICAgIHdhdmZwID0gZm9wZW4od2F2X2ZpbGVbY2hhbm5lbF0sICJyIik7CisgICAgaWYgKCEgd2F2ZnApCisgICAgICByZXR1cm4gLWVycm5vOworICAgIGlmIChmc2Vlayh3YXZmcCwgc2l6ZW9mKHN0cnVjdCB3YXZlX2hlYWRlciksIFNFRUtfU0VUKSA8IDApCisgICAgICByZXR1cm4gLWVycm5vOworICB9CisgIGlmIChvZmZzZXQgKyBidWZzaXplID4gd2F2X2ZpbGVfc2l6ZVtjaGFubmVsXSkKKyAgICBidWZzaXplID0gd2F2X2ZpbGVfc2l6ZVtjaGFubmVsXSAtIG9mZnNldDsKKyAgYnVmc2l6ZSAvPSBjaGFubmVsczsKKyAgZm9yIChzaXplID0gMDsgc2l6ZSA8IGJ1ZnNpemU7IHNpemUgKz0gMikgeworICAgIGludCBjaG47CisgICAgZm9yIChjaG4gPSAwOyBjaG4gPCBjaGFubmVsczsgY2huKyspIHsKKyAgICAgIGlmIChjaG4gPT0gY2hhbm5lbCkgeworCWlmIChmcmVhZChidWYsIDIsIDEsIHdhdmZwKSAhPSAxKQorCSAgcmV0dXJuIHNpemU7CisgICAgICB9CisgICAgICBlbHNlCisJKmJ1ZiA9IDA7CisgICAgICBidWYrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNpemU7Cit9CisKKworLyoKKyAqICAgVHJhbnNmZXIgbWV0aG9kIC0gd3JpdGUgb25seQorICovCisKK3N0YXRpYyBpbnQgd3JpdGVfYnVmZmVyKHNuZF9wY21fdCAqaGFuZGxlLCB1aW50OF90ICpwdHIsIGludCBjcHRyKQoreworICBpbnQgZXJyOworCisgIHdoaWxlIChjcHRyID4gMCkgeworCisgICAgZXJyID0gc25kX3BjbV93cml0ZWkoaGFuZGxlLCBwdHIsIGNwdHIpOworCisgICAgaWYgKGVyciA9PSAtRUFHQUlOKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgZnByaW50ZihzdGRlcnIsIF8oIldyaXRlIGVycm9yOiAlZCwlc1xuIiksIGVyciwgc25kX3N0cmVycm9yKGVycikpOworICAgICAgaWYgKHhydW5fcmVjb3ZlcnkoaGFuZGxlLCBlcnIpIDwgMCkgeworCWZwcmludGYoc3RkZXJyLCBfKCJ4cnVuX3JlY292ZXJ5IGZhaWxlZDogJWQsJXNcbiIpLCBlcnIsIHNuZF9zdHJlcnJvcihlcnIpKTsKKwlyZXR1cm4gLTE7CisgICAgICB9CisgICAgICBicmVhazsJLyogc2tpcCBvbmUgcGVyaW9kICovCisgICAgfQorCisgICAgcHRyICs9IHNuZF9wY21fZnJhbWVzX3RvX2J5dGVzKGhhbmRsZSwgZXJyKTsKKyAgICBjcHRyIC09IGVycjsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3cml0ZV9sb29wKHNuZF9wY21fdCAqaGFuZGxlLCBpbnQgY2hhbm5lbCwgaW50IHBlcmlvZHMsIHVpbnQ4X3QgKmZyYW1lcykKK3sKKyAgZG91YmxlIHBoYXNlID0gMDsKKyAgaW50CSBwYXR0ZXJuID0gMDsKKyAgaW50ICAgIGVyciwgbjsKKworICBmZmx1c2goc3Rkb3V0KTsKKyAgaWYgKHRlc3RfdHlwZSA9PSBURVNUX1dBVikgeworICAgIGludCBidWZzaXplID0gc25kX3BjbV9mcmFtZXNfdG9fYnl0ZXMoaGFuZGxlLCBwZXJpb2Rfc2l6ZSk7CisgICAgbiA9IDA7CisgICAgd2hpbGUgKChlcnIgPSByZWFkX3dhdigodWludDE2X3QgKilmcmFtZXMsIGNoYW5uZWwsIG4sIGJ1ZnNpemUpKSA+IDApIHsKKyAgICAgIG4gKz0gZXJyOworICAgICAgaWYgKChlcnIgPSB3cml0ZV9idWZmZXIoaGFuZGxlLCBmcmFtZXMsCisJCQkgICAgICBzbmRfcGNtX2J5dGVzX3RvX2ZyYW1lcyhoYW5kbGUsIGVyciAqIGNoYW5uZWxzKSkpIDwgMCkKKwlicmVhazsKKyAgICB9CisgICAgaWYgKGJ1ZmZlcl9zaXplID4gbikgeworICAgICAgc25kX3BjbV9kcmFpbihoYW5kbGUpOworICAgICAgc25kX3BjbV9wcmVwYXJlKGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBlcnI7CisgIH0KKyAgICAKKworICBpZiAocGVyaW9kcyA8PSAwKQorICAgIHBlcmlvZHMgPSAxOworCisgIGZvcihuID0gMDsgbiA8IHBlcmlvZHM7IG4rKykgeworICAgIGlmICh0ZXN0X3R5cGUgPT0gVEVTVF9QSU5LX05PSVNFKQorICAgICAgZ2VuZXJhdGVfcGlua19ub2lzZShmcmFtZXMsIGNoYW5uZWwsIHBlcmlvZF9zaXplKTsKKyAgICBlbHNlIGlmICh0ZXN0X3R5cGUgPT0gVEVTVF9QQVRURVJOKQorICAgICAgZ2VuZXJhdGVfcGF0dGVybihmcmFtZXMsIGNoYW5uZWwsIHBlcmlvZF9zaXplLCAmcGF0dGVybik7CisgICAgZWxzZQorICAgICAgZ2VuZXJhdGVfc2luZShmcmFtZXMsIGNoYW5uZWwsIHBlcmlvZF9zaXplLCAmcGhhc2UpOworCisgICAgaWYgKChlcnIgPSB3cml0ZV9idWZmZXIoaGFuZGxlLCBmcmFtZXMsIHBlcmlvZF9zaXplKSkgPCAwKQorICAgICAgcmV0dXJuIGVycjsKKyAgfQorICBpZiAoYnVmZmVyX3NpemUgPiBuICogcGVyaW9kX3NpemUpIHsKKyAgICBzbmRfcGNtX2RyYWluKGhhbmRsZSk7CisgICAgc25kX3BjbV9wcmVwYXJlKGhhbmRsZSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhlbHAodm9pZCkKK3sKKyAgY29uc3QgaW50ICpmbXQ7CisKKyAgcHJpbnRmKAorCSBfKCJVc2FnZTogc3BlYWtlci10ZXN0IFtPUFRJT05dLi4uIFxuIgorCSAgICItaCwtLWhlbHAJaGVscFxuIgorCSAgICItRCwtLWRldmljZQlwbGF5YmFjayBkZXZpY2VcbiIKKwkgICAiLXIsLS1yYXRlCXN0cmVhbSByYXRlIGluIEh6XG4iCisJICAgIi1jLC0tY2hhbm5lbHMJY291bnQgb2YgY2hhbm5lbHMgaW4gc3RyZWFtXG4iCisJICAgIi1mLC0tZnJlcXVlbmN5CXNpbmUgd2F2ZSBmcmVxdWVuY3kgaW4gSHpcbiIKKwkgICAiLUYsLS1mb3JtYXQJc2FtcGxlIGZvcm1hdFxuIgorCSAgICItYiwtLWJ1ZmZlcglyaW5nIGJ1ZmZlciBzaXplIGluIHVzXG4iCisJICAgIi1wLC0tcGVyaW9kCXBlcmlvZCBzaXplIGluIHVzXG4iCisJICAgIi1QLC0tbnBlcmlvZHMJbnVtYmVyIG9mIHBlcmlvZHNcbiIKKwkgICAiLXQsLS10ZXN0CXBpbms9dXNlIHBpbmsgbm9pc2UsIHNpbmU9dXNlIHNpbmUgd2F2ZSwgd2F2PVdBViBmaWxlXG4iCisJICAgIi1sLC0tbmxvb3BzCXNwZWNpZnkgbnVtYmVyIG9mIGxvb3BzIHRvIHRlc3QsIDAgPSBpbmZpbml0ZVxuIgorCSAgICItcywtLXNwZWFrZXIJc2luZ2xlIHNwZWFrZXIgdGVzdC4gVmFsdWVzIDE9TGVmdCwgMj1yaWdodCwgZXRjXG4iCisJICAgIi13LC0td2F2ZmlsZQlVc2UgdGhlIGdpdmVuIFdBViBmaWxlIGFzIGEgdGVzdCBzb3VuZFxuIgorCSAgICItVywtLXdhdmRpcglTcGVjaWZ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBXQVYgZmlsZXNcbiIKKwkgICAiXG4iKSk7CisgIHByaW50ZihfKCJSZWNvZ25pemVkIHNhbXBsZSBmb3JtYXRzIGFyZToiKSk7CisgIGZvciAoZm10ID0gc3VwcG9ydGVkX2Zvcm1hdHM7ICpmbXQgPj0gMDsgZm10KyspIHsKKyAgICBjb25zdCBjaGFyICpzID0gc25kX3BjbV9mb3JtYXRfbmFtZSgqZm10KTsKKyAgICBpZiAocykKKyAgICAgIHByaW50ZigiICVzIiwgcyk7CisgIH0KKworICBwcmludGYoIlxuXG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworICBzbmRfcGNtX3QgICAgICAgICAgICAqaGFuZGxlOworICBpbnQgICAgICAgICAgICAgICAgICAgZXJyLCBtb3JlaGVscDsKKyAgc25kX3BjbV9od19wYXJhbXNfdCAgKmh3cGFyYW1zOworICBzbmRfcGNtX3N3X3BhcmFtc190ICAqc3dwYXJhbXM7CisgIHVpbnQ4X3QgICAgICAgICAgICAgICpmcmFtZXM7CisgIGludCAgICAgICAgICAgICAgICAgICBjaG47CisgIGNvbnN0IGludAkgICAgICAgKmZtdDsKKyAgZG91YmxlCQl0aW1lMSx0aW1lMix0aW1lMzsKKyAgdW5zaWduZWQgaW50CQluLCBubG9vcHM7CisgIHN0cnVjdCAgIHRpbWV2YWwJdHYxLHR2MjsKKworICBzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbltdID0geworICAgIHsiaGVscCIsICAgICAgMCwgTlVMTCwgJ2gnfSwKKyAgICB7ImRldmljZSIsICAgIDEsIE5VTEwsICdEJ30sCisgICAgeyJyYXRlIiwgICAgICAxLCBOVUxMLCAncid9LAorICAgIHsiY2hhbm5lbHMiLCAgMSwgTlVMTCwgJ2MnfSwKKyAgICB7ImZyZXF1ZW5jeSIsIDEsIE5VTEwsICdmJ30sCisgICAgeyJmb3JtYXQiLCAgICAxLCBOVUxMLCAnRid9LAorICAgIHsiYnVmZmVyIiwgICAgMSwgTlVMTCwgJ2InfSwKKyAgICB7InBlcmlvZCIsICAgIDEsIE5VTEwsICdwJ30sCisgICAgeyJucGVyaW9kcyIsICAxLCBOVUxMLCAnUCd9LAorICAgIHsidGVzdCIsICAgICAgMSwgTlVMTCwgJ3QnfSwKKyAgICB7Im5sb29wcyIsICAgIDEsIE5VTEwsICdsJ30sCisgICAgeyJzcGVha2VyIiwgICAxLCBOVUxMLCAncyd9LAorICAgIHsid2F2ZmlsZSIsICAgMSwgTlVMTCwgJ3cnfSwKKyAgICB7IndhdmRpciIsICAgIDEsIE5VTEwsICdXJ30sCisgICAgeyJkZWJ1ZyIsCSAgMCwgTlVMTCwgJ2QnfSwKKyAgICB7TlVMTCwgICAgICAgIDAsIE5VTEwsIDAgIH0sCisgIH07CisKKyNpZmRlZiBFTkFCTEVfTkxTCisgIHNldGxvY2FsZShMQ19BTEwsICIiKTsKKyAgdGV4dGRvbWFpbihQQUNLQUdFKTsKKyNlbmRpZgorCisgIHNuZF9wY21faHdfcGFyYW1zX2FsbG9jYSgmaHdwYXJhbXMpOworICBzbmRfcGNtX3N3X3BhcmFtc19hbGxvY2EoJnN3cGFyYW1zKTsKKyAKKyAgbmxvb3BzID0gMDsKKyAgbW9yZWhlbHAgPSAwOworCisgIHByaW50ZigiXG5zcGVha2VyLXRlc3QgJXNcblxuIiwgU05EX1VUSUxfVkVSU0lPTl9TVFIpOworICB3aGlsZSAoMSkgeworICAgIGludCBjOworICAgIAorICAgIGlmICgoYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJoRDpyOmM6ZjpGOmI6cDpQOnQ6bDpzOnc6VzpkIiwgbG9uZ19vcHRpb24sIE5VTEwpKSA8IDApCisgICAgICBicmVhazsKKyAgICAKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICBjYXNlICdoJzoKKyAgICAgIG1vcmVoZWxwKys7CisgICAgICBicmVhazsKKyAgICBjYXNlICdEJzoKKyAgICAgIGRldmljZSA9IHN0cmR1cChvcHRhcmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnRic6CisgICAgICBmb3JtYXQgPSBzbmRfcGNtX2Zvcm1hdF92YWx1ZShvcHRhcmcpOworICAgICAgZm9yIChmbXQgPSBzdXBwb3J0ZWRfZm9ybWF0czsgKmZtdCA+PSAwOyBmbXQrKykKKyAgICAgICAgaWYgKCpmbXQgPT0gZm9ybWF0KQorICAgICAgICAgIGJyZWFrOworICAgICAgaWYgKCpmbXQgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRm9ybWF0ICVzIGlzIG5vdCBzdXBwb3J0ZWQuLi5cbiIsIHNuZF9wY21fZm9ybWF0X25hbWUoZm9ybWF0KSk7CisgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3InOgorICAgICAgcmF0ZSA9IGF0b2kob3B0YXJnKTsKKyAgICAgIHJhdGUgPSByYXRlIDwgNDAwMCA/IDQwMDAgOiByYXRlOworICAgICAgcmF0ZSA9IHJhdGUgPiAxOTYwMDAgPyAxOTYwMDAgOiByYXRlOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnYyc6CisgICAgICBjaGFubmVscyA9IGF0b2kob3B0YXJnKTsKKyAgICAgIGNoYW5uZWxzID0gY2hhbm5lbHMgPCAxID8gMSA6IGNoYW5uZWxzOworICAgICAgY2hhbm5lbHMgPSBjaGFubmVscyA+IDEwMjQgPyAxMDI0IDogY2hhbm5lbHM7CisgICAgICBicmVhazsKKyAgICBjYXNlICdmJzoKKyAgICAgIGZyZXEgPSBhdG9mKG9wdGFyZyk7CisgICAgICBmcmVxID0gZnJlcSA8IDMwLjAgPyAzMC4wIDogZnJlcTsKKyAgICAgIGZyZXEgPSBmcmVxID4gNTAwMC4wID8gNTAwMC4wIDogZnJlcTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2InOgorICAgICAgYnVmZmVyX3RpbWUgPSBhdG9pKG9wdGFyZyk7CisgICAgICBidWZmZXJfdGltZSA9IGJ1ZmZlcl90aW1lID4gMTAwMDAwMCA/IDEwMDAwMDAgOiBidWZmZXJfdGltZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3AnOgorICAgICAgcGVyaW9kX3RpbWUgPSBhdG9pKG9wdGFyZyk7CisgICAgICBwZXJpb2RfdGltZSA9IHBlcmlvZF90aW1lID4gMTAwMDAwMCA/IDEwMDAwMDAgOiBwZXJpb2RfdGltZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1AnOgorICAgICAgbnBlcmlvZHMgPSBhdG9pKG9wdGFyZyk7CisgICAgICBpZiAobnBlcmlvZHMgPCAyIHx8IG5wZXJpb2RzID4gMTAyNCkgeworCWZwcmludGYoc3RkZXJyLCBfKCJJbnZhbGlkIG51bWJlciBvZiBwZXJpb2RzICVkXG4iKSwgbnBlcmlvZHMpOworCWV4aXQoMSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICd0JzoKKyAgICAgIGlmICgqb3B0YXJnID09ICdwJykKKwl0ZXN0X3R5cGUgPSBURVNUX1BJTktfTk9JU0U7CisgICAgICBlbHNlIGlmICgqb3B0YXJnID09ICdzJykKKwl0ZXN0X3R5cGUgPSBURVNUX1NJTkU7CisgICAgICBlbHNlIGlmICgqb3B0YXJnID09ICd3JykKKwl0ZXN0X3R5cGUgPSBURVNUX1dBVjsKKyAgICAgIGVsc2UgaWYgKCpvcHRhcmcgPT0gJ3QnKQorCXRlc3RfdHlwZSA9IFRFU1RfUEFUVEVSTjsKKyAgICAgIGVsc2UgaWYgKGlzZGlnaXQoKm9wdGFyZykpIHsKKwl0ZXN0X3R5cGUgPSBhdG9pKG9wdGFyZyk7CisJaWYgKHRlc3RfdHlwZSA8IFRFU1RfUElOS19OT0lTRSB8fCB0ZXN0X3R5cGUgPiBURVNUX1BBVFRFUk4pIHsKKwkgIGZwcmludGYoc3RkZXJyLCBfKCJJbnZhbGlkIHRlc3QgdHlwZSAlc1xuIiksIG9wdGFyZyk7CisJICBleGl0KDEpOworCX0KKyAgICAgIH0gZWxzZSB7CisJZnByaW50ZihzdGRlcnIsIF8oIkludmFsaWQgdGVzdCB0eXBlICVzXG4iKSwgb3B0YXJnKTsKKwlleGl0KDEpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnbCc6CisgICAgICBubG9vcHMgPSBhdG9pKG9wdGFyZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdzJzoKKyAgICAgIHNwZWFrZXIgPSBhdG9pKG9wdGFyZyk7CisgICAgICBzcGVha2VyID0gc3BlYWtlciA8IDEgPyAwIDogc3BlYWtlcjsKKyAgICAgIHNwZWFrZXIgPSBzcGVha2VyID4gY2hhbm5lbHMgPyAwIDogc3BlYWtlcjsKKyAgICAgIGlmIChzcGVha2VyPT0wKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCBfKCJJbnZhbGlkIHBhcmFtZXRlciBmb3IgLXMgb3B0aW9uLlxuIikpOworICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICB9ICAKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3cnOgorICAgICAgZ2l2ZW5fdGVzdF93YXZfZmlsZSA9IG9wdGFyZzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1cnOgorICAgICAgd2F2X2ZpbGVfZGlyID0gb3B0YXJnOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnZCc6CisgICAgICBkZWJ1ZyA9IDE7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZnByaW50ZihzdGRlcnIsIF8oIlVua25vd24gb3B0aW9uICclYydcbiIpLCBjKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChtb3JlaGVscCkgeworICAgIGhlbHAoKTsKKyAgICBleGl0KEVYSVRfU1VDQ0VTUyk7CisgIH0KKworICBpZiAodGVzdF90eXBlID09IFRFU1RfV0FWKQorICAgIGZvcm1hdCA9IFNORF9QQ01fRk9STUFUX1MxNl9MRTsgLyogZml4ZWQgZm9ybWF0ICovCisKKyAgcHJpbnRmKF8oIlBsYXliYWNrIGRldmljZSBpcyAlc1xuIiksIGRldmljZSk7CisgIHByaW50ZihfKCJTdHJlYW0gcGFyYW1ldGVycyBhcmUgJWlIeiwgJXMsICVpIGNoYW5uZWxzXG4iKSwgcmF0ZSwgc25kX3BjbV9mb3JtYXRfbmFtZShmb3JtYXQpLCBjaGFubmVscyk7CisgIHN3aXRjaCAodGVzdF90eXBlKSB7CisgIGNhc2UgVEVTVF9QSU5LX05PSVNFOgorICAgIHByaW50ZihfKCJVc2luZyAxNiBvY3RhdmVzIG9mIHBpbmsgbm9pc2VcbiIpKTsKKyAgICBicmVhazsKKyAgY2FzZSBURVNUX1NJTkU6CisgICAgcHJpbnRmKF8oIlNpbmUgd2F2ZSByYXRlIGlzICUuNGZIelxuIiksIGZyZXEpOworICAgIGJyZWFrOworICBjYXNlIFRFU1RfV0FWOgorICAgIHByaW50ZihfKCJXQVYgZmlsZShzKVxuIikpOworICAgIGJyZWFrOworCisgIH0KKworICBpZiAoKGVyciA9IHNuZF9wY21fb3BlbigmaGFuZGxlLCBkZXZpY2UsIFNORF9QQ01fU1RSRUFNX1BMQVlCQUNLLCAwKSkgPCAwKSB7CisgICAgcHJpbnRmKF8oIlBsYXliYWNrIG9wZW4gZXJyb3I6ICVkLCVzXG4iKSwgZXJyLHNuZF9zdHJlcnJvcihlcnIpKTsKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIH0KKworICBpZiAoKGVyciA9IHNldF9od3BhcmFtcyhoYW5kbGUsIGh3cGFyYW1zLCBTTkRfUENNX0FDQ0VTU19SV19JTlRFUkxFQVZFRCkpIDwgMCkgeworICAgIHByaW50ZihfKCJTZXR0aW5nIG9mIGh3cGFyYW1zIGZhaWxlZDogJXNcbiIpLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisgICAgc25kX3BjbV9jbG9zZShoYW5kbGUpOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfQorICBpZiAoKGVyciA9IHNldF9zd3BhcmFtcyhoYW5kbGUsIHN3cGFyYW1zKSkgPCAwKSB7CisgICAgcHJpbnRmKF8oIlNldHRpbmcgb2Ygc3dwYXJhbXMgZmFpbGVkOiAlc1xuIiksIHNuZF9zdHJlcnJvcihlcnIpKTsKKyAgICBzbmRfcGNtX2Nsb3NlKGhhbmRsZSk7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9CisgIGlmIChkZWJ1ZykgeworICAgIHNuZF9vdXRwdXRfdCAqbG9nOworICAgIGVyciA9IHNuZF9vdXRwdXRfc3RkaW9fYXR0YWNoKCZsb2csIHN0ZGVyciwgMCk7CisgICAgaWYgKGVyciA+PSAwKSB7CisgICAgICBzbmRfcGNtX2R1bXAoaGFuZGxlLCBsb2cpOworICAgICAgc25kX291dHB1dF9jbG9zZShsb2cpOworICAgIH0KKyAgfQorCisgIGZyYW1lcyA9IG1hbGxvYyhzbmRfcGNtX2ZyYW1lc190b19ieXRlcyhoYW5kbGUsIHBlcmlvZF9zaXplKSk7CisgIGlmICh0ZXN0X3R5cGUgPT0gVEVTVF9QSU5LX05PSVNFKQorICAgIGluaXRpYWxpemVfcGlua19ub2lzZSgmcGluaywgMTYpOworICAKKyAgaWYgKGZyYW1lcyA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsIF8oIk5vIGVub3VnaCBtZW1vcnlcbiIpKTsKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIH0KKyAgaWYgKHNwZWFrZXI9PTApIHsKKworICAgIGlmICh0ZXN0X3R5cGUgPT0gVEVTVF9XQVYpIHsKKyAgICAgIGZvciAoY2huID0gMDsgY2huIDwgY2hhbm5lbHM7IGNobisrKSB7CisJaWYgKHNldHVwX3dhdl9maWxlKGNobikgPCAwKQorCSAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgfQorICAgIH0KKworICAgIGZvciAobiA9IDA7ICEgbmxvb3BzIHx8IG4gPCBubG9vcHM7IG4rKykgeworCisgICAgICBnZXR0aW1lb2ZkYXkoJnR2MSwgTlVMTCk7CisgICAgICBmb3IoY2huID0gMDsgY2huIDwgY2hhbm5lbHM7IGNobisrKSB7CisJaW50IGNoYW5uZWw9Y2huOworCWlmIChjaGFubmVscyA9PSA0KSB7CisJICAgIGNoYW5uZWw9Y2hhbm5lbHM0W2Nobl07CisJfQorCWlmIChjaGFubmVscyA9PSA2KSB7CisJICAgIGNoYW5uZWw9Y2hhbm5lbHM2W2Nobl07CisJfQorCWlmIChjaGFubmVscyA9PSA4KSB7CisJICAgIGNoYW5uZWw9Y2hhbm5lbHM4W2Nobl07CisJfQorICAgICAgICBwcmludGYoIiAlZCAtICVzXG4iLCBjaGFubmVsLCBnZXR0ZXh0KGNoYW5uZWxfbmFtZVtjaGFubmVsXSkpOworCisgICAgICAgIGVyciA9IHdyaXRlX2xvb3AoaGFuZGxlLCBjaGFubmVsLCAoKHJhdGUqMykvcGVyaW9kX3NpemUpLCBmcmFtZXMpOworCisgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsIF8oIlRyYW5zZmVyIGZhaWxlZDogJXNcbiIpLCBzbmRfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgICAgZnJlZShmcmFtZXMpOworICAgICAgICAgIHNuZF9wY21fY2xvc2UoaGFuZGxlKTsKKyAgICAgICAgICBleGl0KEVYSVRfU1VDQ0VTUyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGdldHRpbWVvZmRheSgmdHYyLCBOVUxMKTsKKyAgICAgIHRpbWUxID0gKGRvdWJsZSl0djEudHZfc2VjICsgKChkb3VibGUpdHYxLnR2X3VzZWMgLyAxMDAwMDAwLjApOworICAgICAgdGltZTIgPSAoZG91YmxlKXR2Mi50dl9zZWMgKyAoKGRvdWJsZSl0djIudHZfdXNlYyAvIDEwMDAwMDAuMCk7CisgICAgICB0aW1lMyA9IHRpbWUyIC0gdGltZTE7CisgICAgICBwcmludGYoXygiVGltZSBwZXIgcGVyaW9kID0gJWxmXG4iKSwgdGltZTMgKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKHRlc3RfdHlwZSA9PSBURVNUX1dBVikgeworICAgICAgaWYgKHNldHVwX3dhdl9maWxlKHNwZWFrZXIgLSAxKSA8IDApCisJZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKworICAgIHByaW50ZigiICAtICVzXG4iLCBnZXR0ZXh0KGNoYW5uZWxfbmFtZVtzcGVha2VyLTFdKSk7CisgICAgZXJyID0gd3JpdGVfbG9vcChoYW5kbGUsIHNwZWFrZXItMSwgKChyYXRlKjUpL3BlcmlvZF9zaXplKSwgZnJhbWVzKTsKKworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgXygiVHJhbnNmZXIgZmFpbGVkOiAlc1xuIiksIHNuZF9zdHJlcnJvcihlcnIpKTsKKyAgICB9CisgIH0KKworCisgIGZyZWUoZnJhbWVzKTsKKyAgc25kX3BjbV9jbG9zZShoYW5kbGUpOworCisgIGV4aXQoRVhJVF9TVUNDRVNTKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9iaW4vYWNvbm5lY3QgYi91c3IvYmluL2Fjb25uZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NTMxYmQwLi4wMDAwMDAwCi0tLSBhL3Vzci9iaW4vYWNvbm5lY3QKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91c3IvYmluL2Fsc2Fsb29wIGIvdXNyL2Jpbi9hbHNhbG9vcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjg3YWYxMy4uMDAwMDAwMAotLS0gYS91c3IvYmluL2Fsc2Fsb29wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXNyL2Jpbi9hbHNhbWl4ZXIgYi91c3IvYmluL2Fsc2FtaXhlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTM1ZWQzMC4uMDAwMDAwMAotLS0gYS91c3IvYmluL2Fsc2FtaXhlcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Vzci9iaW4vYWxzYXVjbSBiL3Vzci9iaW4vYWxzYXVjbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODNmYWU0MS4uMDAwMDAwMAotLS0gYS91c3IvYmluL2Fsc2F1Y20KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91c3IvYmluL2FtaWRpIGIvdXNyL2Jpbi9hbWlkaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzkyY2ZiNi4uMDAwMDAwMAotLS0gYS91c3IvYmluL2FtaWRpCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXNyL2Jpbi9hbWl4ZXIgYi91c3IvYmluL2FtaXhlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGJmODFhMi4uMDAwMDAwMAotLS0gYS91c3IvYmluL2FtaXhlcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Vzci9iaW4vYXBsYXkgYi91c3IvYmluL2FwbGF5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNWFiODA5Li4wMDAwMDAwCi0tLSBhL3Vzci9iaW4vYXBsYXkKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91c3IvYmluL2FwbGF5bWlkaSBiL3Vzci9iaW4vYXBsYXltaWRpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNjI0MGNhLi4wMDAwMDAwCi0tLSBhL3Vzci9iaW4vYXBsYXltaWRpCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXNyL2Jpbi9hcmVjb3JkIGIvdXNyL2Jpbi9hcmVjb3JkCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA4MmZiZDQzLi4wMDAwMDAwCi0tLSBhL3Vzci9iaW4vYXJlY29yZAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWFwbGF5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXNyL2Jpbi9hcmVjb3JkbWlkaSBiL3Vzci9iaW4vYXJlY29yZG1pZGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk0N2EwMmQuLjAwMDAwMDAKLS0tIGEvdXNyL2Jpbi9hcmVjb3JkbWlkaQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Vzci9iaW4vYXNlcWR1bXAgYi91c3IvYmluL2FzZXFkdW1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMDNiNGRmLi4wMDAwMDAwCi0tLSBhL3Vzci9iaW4vYXNlcWR1bXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91c3IvYmluL2FzZXFuZXQgYi91c3IvYmluL2FzZXFuZXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQyNDYyOTYuLjAwMDAwMDAKLS0tIGEvdXNyL2Jpbi9hc2VxbmV0CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXNyL2Jpbi9pZWNzZXQgYi91c3IvYmluL2llY3NldApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjk0NjljMC4uMDAwMDAwMAotLS0gYS91c3IvYmluL2llY3NldAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Vzci9zYmluL2Fsc2FjdGwgYi91c3Ivc2Jpbi9hbHNhY3RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YTMwM2M4Li4wMDAwMDAwCi0tLSBhL3Vzci9zYmluL2Fsc2FjdGwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91dGlscy9NYWtlZmlsZS5hbSBiL3V0aWxzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4M2U1YjQKLS0tIC9kZXYvbnVsbAorKysgYi91dGlscy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQgQEAKK0VYVFJBX0RJU1QgPSBidWlsZHJwbQorCitycG06IGJ1aWxkcnBtIGFsc2EtbGliLnNwZWMKKwlWRVJTSU9OPSQoVkVSU0lPTikgJChzcmNkaXIpL2J1aWxkcnBtCmRpZmYgLS1naXQgYS91dGlscy9hbHNhLXV0aWxzLnNwZWMuaW4gYi91dGlscy9hbHNhLXV0aWxzLnNwZWMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRhZjNiYQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWxzL2Fsc2EtdXRpbHMuc3BlYy5pbgpAQCAtMCwwICsxLDc2IEBACislZGVmaW5lIHZlciAgICAgIEBWRVJTSU9OQAorJWRlZmluZSByZWwgICAgICAxCisKK1N1bW1hcnk6IEFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZSAoQUxTQSkgLSBVdGlscworTmFtZTogYWxzYS11dGlscworVmVyc2lvbjogJXZlcgorUmVsZWFzZTogJXJlbAorQ29weXJpZ2h0OiBHUEwKK0dyb3VwOiBTeXN0ZW0vTGlicmFyaWVzCitTb3VyY2U6IGZ0cDovL2Z0cC5hbHNhLXByb2plY3Qub3JnL3B1Yi91dGlscy9hbHNhLXV0aWxzLSV7dmVyfS50YXIuYnoyCitCdWlsZFJvb3Q6ICV7X3RtcHBhdGh9LyV7bmFtZX0tJXt2ZXJzaW9ufS1yb290CitVUkw6IGh0dHA6Ly93d3cuYWxzYS1wcm9qZWN0Lm9yZworUmVxdWlyZXM6IGFsc2EtbGliIG5jdXJzZXMKK0J1aWxkUmVxdWlyZXM6IGFsc2EtbGliLWRldmVsIG5jdXJzZXMtZGV2ZWwgZ2V0dGV4dAorCislZGVzY3JpcHRpb24KKworQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlIChBTFNBKSAtIFV0aWxzCisKKyVjaGFuZ2Vsb2cKKyogU3VuIE9jdCAgMSAyMDA2IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CistIGFkZCBnZXR0ZXh0IHRvIEJ1aWxkUmVxdWlyZXMKKy0gYWRkIG1vcmUgZmlsZXMgKHNlZSBhbHNhIGJ1ZyMyMTM5KQorCisqIFR1ZSBOb3YgMjUgMjAwMyBSb25ueSBWLiBWaW5kZW5lcyA8c3VibGV0dEBhbWlnYXNjbmUub3JnPgorLSBpbmNsdWRlIGFsbCBtYW5wYWdlcworCisqIFRodSBNYXIgIDYgMjAwMyBSb25ueSBWLiBWaW5kZW5lcyA8c3VibGV0dEBkYy1zLmNvbT4KKworLSByZW1vdmVkIHdyb25nbHkgaW5jbHVkZWQgZG9jIGZpbGUKKy0gY2hhbmdlZCBCdWlsZFJvb3QgZnJvbSAvdmFyL3RtcCB0byBfdG1wcGF0aAorLSB1c2Ugc3RhbmRhcmQgcnBtIG1hY3JvcyBmb3IgYnVpbGQgJiBpbnN0YWxsIHNlY3Rpb24KKy0gdXBkYXRlZCBkZXBlbmRlbmNpZXMKKworKiBUdWUgTm92IDIwIDIwMDEgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKworLSBjaGFuZ2VkIEJ1aWxkUm9vdCBmcm9tIC90bXAgdG8gL3Zhci90bXAKKy0gX3ByZWZpeCBhbmQgX21hbmRpciBtYWNyb3MgYXJlIHVzZWQgZm9yIGNvbmZpZ3VyZSBhbmQgbWtkaXIKKy0gREVTVERJUiBpcyB1c2VkIGZvciBtYWtlIGluc3RhbGwKKworKiBTdW4gTm92IDExIDIwMDEgTWlyb3NsYXYgQmVuZXMgPG1iZW5lc0B0ZW5lei5jej4KKworLSBkYW5nZXJvdXMgY29tbWFuZCAicnBtIC1yZiAkUlBNX0JVSUxEX1JPT1QiIGNoZWNrcyAkUlBNX0JVSUxEX1JPT1QgdmFyaWFibGUKKy0gdW5zZXQga2V5ICJEb2NkaXIiIC0gb24gc29tZSBuZXcgc3lzdGVtcyBhcmUgZG9jdW1lbnRhdGlvbiBpbiAvdXNyL3NoYXJlL2RvYworCisqIE1vbiBNYXkgMjggMTk5OCBIZWxnZSBKZW5zZW4gPHNsb2dAc2xvZy5kaz4KKworLSBNYWRlIFNQRUMgZmlsZQorCislcHJlcAorJXNldHVwCislYnVpbGQKKyVjb25maWd1cmUKK21ha2UKKworJWluc3RhbGwKK1sgIiRSUE1fQlVJTERfUk9PVCIgIT0gIi8iIF0gJiYgcm0gLXJmICRSUE1fQlVJTERfUk9PVAorJW1ha2VpbnN0YWxsCisKKyVjbGVhbgorWyAiJFJQTV9CVUlMRF9ST09UIiAhPSAiLyIgXSAmJiBybSAtcmYgJFJQTV9CVUlMRF9ST09UCisKKyVmaWxlcworJWRlZmF0dHIoLSwgcm9vdCwgcm9vdCkKKworJWRvYyBDaGFuZ2VMb2cgQ09QWUlORyBSRUFETUUKKworJXtfcHJlZml4fS9zYmluLyoKKyV7X3ByZWZpeH0vYmluLyoKKyV7X21hbmRpcn0vbWFuPy8qCisle19tYW5kaXJ9L2ZyL21hbj8vKgorJXtfcHJlZml4fS9zaGFyZS9hbHNhL3NwZWFrZXItdGVzdC8qCisle19wcmVmaXh9L3NoYXJlL2xvY2FsZS9qYS9MQ19NRVNTQUdFUy8qCisle19wcmVmaXh9L3NoYXJlL2xvY2FsZS9ydS9MQ19NRVNTQUdFUy8qCisle19wcmVmaXh9L3NoYXJlL21hbi9mci9tYW44L2Fsc2Fjb25mLjguZ3oKKyV7X3ByZWZpeH0vc2hhcmUvc291bmRzL2Fsc2EvKgpkaWZmIC0tZ2l0IGEvdXRpbHMvYnVpbGRycG0gYi91dGlscy9idWlsZHJwbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTlhYjg2Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbHMvYnVpbGRycG0KQEAgLTAsMCArMSw0NCBAQAorIyEvYmluL2Jhc2gKKworc291cmNlPS4KK3ZlcnNpb249YGNhdCAkc291cmNlLy4uL3ZlcnNpb25gCitwYWNrYWdlPSRzb3VyY2UvLi4vYWxzYS11dGlscy0kdmVyc2lvbi50YXIuYnoyCitwYWNrYWdlZGlyPS91c3Ivc3JjL3JlZGhhdAoreHJwbWJ1aWxkPXJwbQorcnBtYnVpbGQgLS11c2FnZSAyPiAvZGV2L251bGwgPiAvZGV2L251bGwgJiYgeHJwbWJ1aWxkPXJwbWJ1aWxkCisKKyMgU3VTRSBwYXRoCitpZiBbIC1kIC91c3Ivc3JjL3BhY2thZ2VzIF07IHRoZW4KKyAgcGFja2FnZWRpcj0vdXNyL3NyYy9wYWNrYWdlcworZmkKKworbWFrZSAtQyAuLiBjbGVhbgorbWFrZSAtQyAuLiBkaXN0CisKK2lmIFsgISAtciAkcGFja2FnZSBdOyB0aGVuCisgIGVjaG8gIkVycm9yOiB3cm9uZyBwYWNrYWdlOiAkcGFja2FnZSIKKyAgZXhpdCAxCitmaQorCitjcCAtZnYgJHBhY2thZ2UgJHtwYWNrYWdlZGlyfS9TT1VSQ0VTCisKK2lmIFsgISAtciAkc291cmNlL2J1aWxkcnBtIF07IHRoZW4KKyAgZWNobyAiRXJyb3I6IGludmFsaWQgZGlyZWN0b3J5OiAkc291cmNlIgorICBleGl0IDEKK2ZpCisKK2lmIFsgISAtZCAke3BhY2thZ2VkaXJ9IF07IHRoZW4KKyAgZWNobyAiRXJyb3I6ICR7cGFja2FnZWRpcn0gZGlyZWN0b3J5IG5vdCBmb3VuZCIKKyAgZXhpdCAxCitmaQorCitpZiBbICEgLXIgJHNvdXJjZS9hbHNhZHJpdmVyLnNwZWMgXTsgdGhlbgorICBjZCAkc291cmNlLy4uCisgIC4vY29uZmlndXJlCisgIGNkIHV0aWxzCitmaQorCitjcCAtZnYgJHNvdXJjZS9hbHNhLXV0aWxzLnNwZWMgJHtwYWNrYWdlZGlyfS9TUEVDUworY2QgJHtwYWNrYWdlZGlyfS9TUEVDUworJHhycG1idWlsZCAtYmEgYWxzYS11dGlscy5zcGVjCitjZCAke3BhY2thZ2VkaXJ9Cg==